1.策略模式

定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换

1.1 传统实现

根据工资基数和年底绩效来发送年终奖

  1. var calculateBonus= function (performanceLevel,salary) {
  2. if(performanceLevel === 'S'){
  3. return salary * 4;
  4. }
  5. if(performanceLevel === 'A'){
  6. return salary * 3;
  7. }
  8. if(performanceLevel === 'B'){
  9. return salary * 2;
  10. }
  11. };
  12. calculateBonus('B',20000);//输出40000
  13. calculateBonus('S',6000);//输出24000

calculateBonus()函数包含了很多if-else语句,这些语句需要覆盖所有分支
calculateBonus()函数缺乏扩展性,如果新增一个绩效等级C,必须修改calculateBonus()函数内部实习,违反开发-封闭原则

1.2 使用策略模式重构代码

传统面向对象模式的策略模式

  1. var performanceS= function () {};
  2. performanceS().prototype.calculate= function (salary) {
  3. return salary *4;
  4. };
  5.  
  6. var performanceA=function(){};
  7. performanceA().prototype.calculate=function(salary){
  8. return salary * 3;
  9. };
  10.  
  11. var Bonus= function () {
  12. this.salary=null;
  13. this.strategy=null;
  14. };
  15. Bonus.prototype.setSalary= function (salary) {
  16. this.salary=salary;
  17. };
  18. Bonus.prototype.setStrategy=function(strategy){
  19. this.strategy=strategy;
  20. };
  21. Bonus.prototype.getBonus= function () {
  22. return this.strategy.calculate(this.salary);
  23. };
  24.  
  25. var bonus=new Bonus();
  26. bonus.setSalary(1000);
  27. bonus.setStrategy(new performanceS());
  28. console.log(bonus.getBonus()());//输出40000

1.3 JavaScript版本的策略模式

  1. var strategies={
  2. "S": function (salary) {
  3. return salary*4;
  4. },
  5. "A": function (salary) {
  6. return salary*3;
  7. },
  8. "B": function (salary) {
  9. return salary*2;
  10. }
  11. };
  12. //calculateBonus充当Context来接受用户请求
  13. var calculateBonus= function (level,salary) {
  14. return strategies[level](salary);
  15. };
  16. console.log(calculateBonus('S',2000));//输出8000

1.4 用策略模式来重构表单校验

校验规则
用户名不能为空
密码长度不能少于6位
手机号码必须符合格式

  1. var strategise={
  2. isNonEmpty:function(value,errorMsg){
  3. if(value === ''){
  4. return errorMsg;
  5. }
  6. },
  7. minLength: function (value,length,errorMsg) {
  8. if(value.length<length){
  9. return errorMsg;
  10. }
  11. },
  12. isMobile: function (value,errorMsg) {
  13. if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
  14. return errorMsg;
  15. }
  16. }
  17. };

Validateor类作为Context,负责接收用户请求,并委托给strategy对象

  1. var validataFunc= function () {
  2. var validator=new Validator();
  3.  
  4. //添加校验规则
  5. validator.add(form.userName,'isNonEmpty','用户名不能为空');
  6. validator.add(form.password,'minLength:6','密码长度不能少于6位');
  7. validator.add(form.phoneNumber,'isMobile','手机号码格式不正确');
  8. var errorMsg=validator.start();
  9. return errorMsg;
  10. };
  11.  
  12. var form =document.getElementById('form');
  13. form.onsubmit= function () {
  14. var errorMsg=validataFunc();
  15. if(errorMsg){
  16. alert(errorMsg);
  17. return false;
  18. }
  19. };
  20.  
  21. var Validator= function () {
  22. this.cache=[];
  23. };
  24. Validator.prototype.add= function (dom,rule,errorMsg) {
  25. var ary=rule.split(':');//把strategy算法和参数分开
  26. this.cache.push(function () {
  27. var strategy=ary.shift();
  28. ary.unshift(dom.value);
  29. ary.push(errorMsg);
  30. return strategies[strategy].apply(dom,ary);
  31. });
  32. };
  33.  
  34. Validator.prototype.start= function () {
  35. for(var i= 0,validatorFunc;validatorFunc=this.cache[i++];){
  36. var msg=validatorFunc();
  37. if(msg){
  38. return msg;
  39. }
  40. }
  41. };

使用策略模式,可以通过配置方式完成表单校验

《JavaScript设计模式与开发实践》读书笔记之策略模式的更多相关文章

  1. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  2. JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)

    上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...

  3. Javascript设计模式与开发实践读书笔记(1-3章)

    第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用   多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...

  4. javascript设计模式与开发实践阅读笔记(5)——策略模式

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...

  5. javascript设计模式与开发实践阅读笔记(8)——观察者模式

    发布-订阅模式,也叫观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 在JavaScript开发中,我们一般用事件模型来替代传统的观察者模式. ...

  6. javascript设计模式与开发实践阅读笔记(7)——迭代器模式

    迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  7. javascript设计模式与开发实践阅读笔记(6)——代理模式

    代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...

  8. javascript设计模式与开发实践阅读笔记(4)——单例模式

    定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...

  9. 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式

    第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...

  10. 《JavaScript设计模式与开发实践》笔记第一章

    第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...

随机推荐

  1. Windows 8 动手实验系列教程 实验7:磁贴和通知

    动手实验 实验7:磁贴和通知 2012年9月 简介 磁贴是Windows应用商店应用用户体验的重要元素.当应用程序被安装后,它的磁贴将在Windows 8开始屏幕被创建.该磁贴(称为主磁贴)作为启动应 ...

  2. python 调用shell命令三种方法

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将pyth ...

  3. jsp获得本地及serverIP的方法

    InetAddress addr = InetAddress.getLocalHost(); String ip = addr.getHostAddress().toString();//获得本机IP ...

  4. 判断指定进程是否为x64的方法(在ntdll判断某个x64函数是否存在)

    BOOL IsWow64ProcessEx(HANDLE hProcess) { // 如果系统是x86的,那么进程就不可能有x64 bool isX86 = false; #ifndef _WIN6 ...

  5. Android 服务类Service 的具体学习

    上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...

  6. Android平均分布的布局图像的下一行

    Android下一行平均分布图片的布局 这是一个非经常见的需求,比方有三个图片button,须要在底部三个平均,比方下个样例: 下面是布局文件 <LinearLayout android:lay ...

  7. kiss框架学习

    #parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...

  8. gtk+blade+anjuta 的简单实例

    gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04   1>  选择源 不正确会有很多问题,速度慢,找不到安装的软件.163的源就不错 http://mirrors. ...

  9. python转换时间戳和日期时间格式的转换

    [steven@txzxp2 seccenter]$ python Python 2.7.5 (default, Jul  8 2013, 09:48:59)  [GCC 4.8.1 20130603 ...

  10. windows下Memcached 架设及java应用

    1  Memcached 介绍   Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据 ...