定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。
目的:将算法的使用和算法的实现分离开来。
比如:

if(input == 'A'){
return 1;
}
if(input == 'B'){
return 2;
}
if(input == 'C'){
return 3;
}
//或者
switch(input){
case 'A':
console.log(1);
break;
case 'B':
console.log(2);
break;
case 'C':
console.log(3);
break;
}

对于这种有多个if-else和switch语句的情况,可以使用策略模式来处理。

策略模式有两部分组成:
一、策略类:封装了具体的算法,并负责具体计算过程。
二、环境类:接受客户的请求,然后将请求委托给某个策略类

//策略类Strategy
var strategies = {
"A": function(num){
return 1 + num;
},
"B": function(num){
return 2 + num;
},
"C": function(num){
return 3 + num;
}
};
//环境类Context
var calculate = function(level,num){
return strategies[level](num);
};
//调用
result = calculate('A',10);

使用策略模式也可以用来封装一系列的业务规则,只要这些业务规则指向的目标一致,并且可以被替换使用,我们就可以用策略模式来封装它们。

表单校验:
一般写法:

function checkForm(){
if($("#name").val()==''){
alert('用户名不能为空!');
return false;
}
if($("#password").val().length<6){
alert('密码长度不能少于6位!');
return false;
}
if(!/(^1[3|5|8][0-9]{9}$)/.test($("#phone").val())){
alert('手机号格式不正确!');
return false;
}
}

使用“策略模式”:

/***********************策略对象Strategy***********************/
var strategise={
isEmpty: function(value,errorMsg){
if(value === ''){
return errorMsg;
}
},
minLength: function (value,length,errorMsg) {
if(value.length<length){
return errorMsg;
}
},
isMobile: function (value,errorMsg) {
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
return errorMsg;
}
}
}; /***********************Validator类Context***********************/
var Validator= function () {
this.cache=[]; //保存校验规则
}; Validator.prototype.add = function(dom,rules){
var self = this;
for(var i=0, rule; rule=rules.strategy.split(":")){
(function(rule){
var strateAry = rule.strategy.split(":");
var errorMsg = rule.errorMsg; self.cache.push(function(){
var strategy = strateAry.shift();//把数组的第一个元素从其中删除。
strateAry.unshift(dom.val()); //向数组的开头添加input元素的值。
strateAry.push(errorMsg); //在数组尾部添加error信息
return strategies[strategy].apply(dom,strateAry);
});
})(rule)
}
}; Validator.prototype.start = function(){
for(var i=0, Func; Func=this.cache[i];i++){
var errorMsg = Func();
if(errorMsg){
return errorMsg;
}
}
}; /***********************调用***********************/
var checkForm = function(){
var validator = new Validator(); validator.add($("#name"),[{
strategy: 'isEmpty',
errorMsg: '用户名不能为空!'
},{
strategy: 'minLength:6',
errorMsg: '用户名长度不能小于6位'
}]);
validator.add($("#password"),[{
strategy: 'minLength:6',
errorMsg: '密码长度不能小于6位'
}]);
validator.add($("#phone"),[{
strategy: 'isMobile',
errorMsg: '手机号格式不正确!'
}]); var errorMsg = validator.start();
return errorMsg;
}
$("form").submit(function(){
var errorMsg = checkForm();
if(errorMsg){
alert(errorMsg);
return fasle;
}
});

优点:
1、采用组合、委托和多态等技术和思想,有效地避免多重条件选择语句。
2、对“开放封闭原则”完美支持,将算法独立封装在strategy,使得它们易于切换、理解和扩展。
3、策略模式中的算法也可以复用在系统的其他地方,从而避免重复的复制粘贴工作。
4、利用组合和委托让Context拥有执行算法的能力,这也是继承的一种轻便替代方案。

Javascript设计模式学习三(策略模式)的更多相关文章

  1. javascript设计模式学习之五——策略模式

    一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...

  2. javascript设计模式--策略模式

    javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...

  3. JavaScript设计模式 Item 7 --策略模式Strategy

    1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...

  4. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

  5. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

  6. Java设计模式学习记录-策略模式

    策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...

  7. Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口

    续上一篇  <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...

  8. Java设计模式学习三-----工厂模式

    工厂模式 工厂模式(Factory Pattern)是Java中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻 ...

  9. javascript设计模式学习之六——代理模式

    一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...

随机推荐

  1. Spring 代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

  2. 安全测试 - CSRF攻击及防御

    CSRF(Cross-site request forgery跨站请求伪造) 尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左.XSS利用站点内的信任用户,而CSRF则通过伪 ...

  3. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  4. Lintcode答案&笔记

    1.A+B问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符 思路:作异或得到未进位和,作与并向左移1位得到进位,随后再重复操作俩结果,直到进位为0,适合用递归 public in ...

  5. SSM整合(三):Spring4与Mybatis3与SpringMVC整合

    源码下载 SSMDemo 上一节整合了Mybatis3与Spring4,接下来整合SpringMVC! 说明:整合SpringMVC必须是在web项目中,所以前期,新建的就是web项目! 本节全部采用 ...

  6. zabbix利用api批量添加item,并且批量配置添加graph

    关于zabbix的API见,zabbixAPI 1item批量添加 我是根据我这边的具体情况来做的,本来想在模板里面添加item,但是看了看API不支持,只是支持在host里面添加,所以我先在一个ho ...

  7. Bootstrap JavaScript插件

      在bs3.X中,提供了12种JavaScript插件,分别是:动画过渡(Transition).模态弹窗(Modal).下拉菜单(Dropdown).滚动侦测(Scrollspy).选项卡(Tab ...

  8. ORB-SLAM(五)优化

    ORB-SLAM作为单目SLAM,其精度很大程度上决定于帧与帧之间的位姿优化的是否准确.因此优化(optimization)在ORB-SLAM里面扮演了很重要的角色.这一小节探讨一下ORB-SLAM里 ...

  9. Android笔记

    SYSTEM_ALERT_WINDOW and WRITE_SETTINGS, 这两个权限比较特殊,不能通过代码申请方式获取,必须得用户打开软件设置页手动打开,才能授权.路径是:Settings-&g ...

  10. ffmpeg获取文件的总时长(mp3/mp4/flv等)

    使用ffmpeg.exe获取文件属性信息,C#中可以在进程外异步调用这个工具,如下: using (System.Diagnostics.Process pro = new System.Diagno ...