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

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. Vmware虚拟机Devstack安装openstack(All in one)

    Vmware虚拟机Devstack安装openstack(All in one) 博客园第一篇博客,先练习一下. 官方文档 环境 Vmware虚拟机 OS : Ubuntu 14.04 Nat网络,D ...

  2. Oracle插入日期格式出现 ORA-01843: not a valid month的解决办法

    Oracle 在插入时间类型的时候如果不注意插入的格式就很容易出错,基本上只要转一下时间格式就可以解决. DateTime转成特定格式的字符串: var dateString = DateTime.N ...

  3. HTMl5的存储方式sessionStorage和localStorage详解

    html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...

  4. [LeetCode] Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  5. .NET高性能框架Chloe.ORM-完美支持MySql

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

  6. 【MySQL】mysql workbench

    1.导入,导出,数据之间的传输[两台服务器]2.连接管理3.服务器管理4.表的管理

  7. day7_subprocess模块和面向对象,反射

    常用subprocess方法示例 #执行命令,返回命令执行状态 , 0 or 非0>>> retcode = subprocess.call(["ls", &qu ...

  8. NodeJs入门学习(一)

    NodeJs是针对前端工程师向web后端深入理解的一门很好的语言. 首先,记录NodeJS几大特性,后续补充: 一.Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. ...

  9. web.xml加载顺序

    一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...

  10. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...