Javascript设计模式学习三(策略模式)
定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。
目的:将算法的使用和算法的实现分离开来。
比如:
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设计模式学习三(策略模式)的更多相关文章
- javascript设计模式学习之五——策略模式
一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...
- javascript设计模式--策略模式
javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...
- JavaScript设计模式 Item 7 --策略模式Strategy
1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
- javascript设计模式实践之策略模式--输入验证
策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...
- 设计模式学习之策略模式(Strategy,行为型模式)(13)
转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...
- Java设计模式学习记录-策略模式
策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...
- Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口
续上一篇 <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...
- Java设计模式学习三-----工厂模式
工厂模式 工厂模式(Factory Pattern)是Java中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻 ...
- javascript设计模式学习之六——代理模式
一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...
随机推荐
- JSP动作元素——————实践篇
本篇在理论的基础上实现不同JSP页面间的跳转 使用 Eclipse Java EE IDE 创建一个新的 Java Web 项目,具体步骤如下: (1)启动 Eclipse Java EE IDE,在 ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: ...
- [LeetCode] Combinations 组合项
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- SQL Server 中master..spt_values的应用
今天在做数据分析报表的时候遇到一个这样的问题. 表结构如下.部门编码.部门名称.部门人员ID(中间用逗号分割) 我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:人员信息(ID或者姓 ...
- Javascript的this用法及jQuery中$this和$(this)的区别
this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...
- oracle日常——修改用户密码
修改密码时,先进入sqlplus的sql命令状态(键入用户名密码之后),命令如下: alter user cnp2 identified by cnp3; --即将用户cnp2的密码修改为cnp3 格 ...
- 关于mybatis中mapper.xmlSQL语句书写的心得
本文主要针对MySQL ---------------------------------------------------------------------------------------- ...
- 数据库中char与varchar类型的区别
在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔 ...
- 格式工厂 v4.0.0 最新去广告绿色纯净版
最好用的多媒体格式转换利器:格式工厂现已更新至v4.0,此次更新加入最新的HEVC(H265)编码,MP4,MKV的压缩比大幅度提高!格式工厂,轻松转换一切你想要的格式!利器在手,转换不愁! 格式工厂 ...