设计模式之策略模式

 策略模式
(本来大量的if else代码,如果有需求更新需要再加if else。所以要用策略模式。把算法和实际业务拆开解藕?
Vip新老客户三个类,各自封一个计算折扣的原型方法供实例调用。
再封一个客户端类,原型set方法初始化数据,原型getResult方法打印结果,getResult方法能访问到set后的初始化数据,所以在set的时候,可以把上面三个类的实例传进去,方便调用上面三个类实例里的方法)

为何要用?答案:对修改关闭,对扩展开放的原则,以其维
护一段庞大的条件性语句,不如将每一个行为划分为多个独立的对象。每一个对象被称为一个策略。设置多个这种策略对象,可以改进我们的代码质量,也更好的进行单元测试。
策略模式指的是定义一系列的算法,并且把它们封装起来,但是策略模式不仅仅只封装算法,我们还可以对用来封装一系列的业务规则,只要这些业务规则目标一致,我们就可以使用策略模式来封装它们;
概念:
策略模式指的是定义一些列的算法,把他们一个个封装起来,目的就是将算法的使用与算法的实现分离开来。说白了就是以前要很多判断的写法,现在把判断里面的内容抽离开来,变成一个个小的个体。
代码实现:

表单验证:

 


 



// 策略对象varstrategys = {    isNotEmpty:function(value,errorMsg) {if(value === '') {returnerrorMsg;        }    },// 限制最小长度minLength:function(value,length,errorMsg) {if(value.length < length) {returnerrorMsg;        }    },// 手机号码格式mobileFormat:function(value,errorMsg) {if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) {returnerrorMsg;        }    } };varValidator =function(){this.cache = [];// 保存效验规则};Validator.prototype.add =function(dom,rules) {varself =this;for(vari = 0, rule; rule = rules[i++]; ){        (function(rule){varstrategyAry = rule.strategy.split(":");varerrorMsg = rule.errorMsg;            self.cache.push(function(){varstrategy = strategyAry.shift();                strategyAry.unshift(dom.value);                strategyAry.push(errorMsg);returnstrategys[strategy].apply(dom,strategyAry);            });        })(rule);    }};Validator.prototype.start =function(){for(vari = 0, validatorFunc; validatorFunc =this.cache[i++]; ) {varmsg = validatorFunc();// 开始效验 并取得效验后的返回信息if(msg) {returnmsg;    }    }};// 代码调用varregisterForm = document.getElementById("registerForm");varvalidateFunc =function(){varvalidator =newValidator();// 创建一个Validator对象/* 添加一些效验规则 */validator.add(registerForm.userName,[        {strategy: 'isNotEmpty',errorMsg:'用户名不能为空'},        {strategy: 'minLength:6',errorMsg:'用户名长度不能小于6位'}    ]);    validator.add(registerForm.password,[        {strategy: 'minLength:6',errorMsg:'密码长度不能小于6位'},    ]);    validator.add(registerForm.phoneNumber,[        {strategy: 'mobileFormat',errorMsg:'手机号格式不正确'},    ]);varerrorMsg = validator.start();// 获得效验结果returnerrorMsg;// 返回效验结果};// 点击确定提交registerForm.onsubmit =function(){varerrorMsg = validateFunc();if(errorMsg){        alert(errorMsg);returnfalse;    }}


通过策略模式,使得客户的折扣与算法解藕,又使得修改跟扩展能独立的进行,不影到客户端或其他算法的使用;
 
使用场景:
  策略模式最实用的场合就是某个“类”中包含有大量的条件性语句,比如if...else 或者 switch。每一个条件分支都会引起该“类”的特定行为以不同的方式作出改变。以其维
护一段庞大的条件性语句,不如将每一个行为划分为多个独立的对象。每一个对象被称为一个策略。设置多个这种策略对象,可以改进我们的代码质量,也更好的进行单元测试。
  
posted @ 2018-07-26 18:04  River89397380  阅读(82)  评论(0)    收藏  举报