js设计模式总结-策略模式
策略模式
要解决的问题
当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题,
比如增加一种的新的方法时,就不得不再去写一条if语句,这不符合开闭原则,也不方便复用,因此策略模式主要解决的是算法的实现和算法的使用的过度耦合问题。
实现原理
将每个算法的实现封装起来,并可以相互替换(因为它们有共同的目的),通过统一的上下文调用,一方面解决了耦合问题,另一方面增强了代码的复用能力
实践中的应用
表单的验证
表单验证涉及到多个判断语句,一般我们会这样实现
var form = document.getElementById('myform')
form.onsubmit = function() {
if (form.username.value === '') {
alert('请输入用户名')
return false
}
if (form.password.value === '') {
alert('请输入密码')
return false
}
if (form.password.value.length < 8) {
alert('密码不小于8位')
return false
}
}
当增加新的字段或者变换新的验证规则时就不得不去修改if语句或者增加新的if语句,而且当别的表单也需要这样验证时没法复用。
所以采用策略模式来实现
// 策略对象,封装一系列的策略
var rules = {
NOT_EMPTY: function(value, errorMsg) {
value = '' + value
if (value === '') {
return errorMsg
}
},
NOT_LESS: function(value, length, errorMsg) {
value = '' + value
if (value.length < length) {
return errorMsg
}
}
}
// 验证器的实现
var Validator = function(rules) {
this.rules = rules
// 保存着验证规则
this.cache = []
}
// 添加规则
Validator.prototype.add = function(value, rule, errorMsg) {
var ruleArray = rule.split(':')
var self = this
if (ruleArray.length === 1) {
// 利用闭包来保存外部的值
this.cache.push(function() {
return self.rules[rule](value, errorMsg)
})
} else if (ruleArray.length === 2) {
this.cache.push(function() {
return self.rules[ruleArray[0]](value, ruleArray[1], errorMsg)
})
}
}
Validator.prototype.start = function() {
var errorMsg = ''
for (var r = 0; r < this.cache.length; r++) {
var errorMsg = this.cache[r]()
if (errorMsg) {
return errorMsg
}
}
}
var form = document.getElementById('myform')
form.onsubmit = function() {
var v = new Validator(rules)
v.add(form.username.value, 'NOT_EMPTY', '请输入用户名')
v.add(form.password.value, 'NOT_LESS:8', '密码不少于8位')
var errorMsg = v.start()
if (errorMsg) {
alert(errorMsg)
return false
}
}
根据上述代码,如果我们添加新的验证规则,只需要在rules添加新的验证函数就可,如果添加新的字段,只需要add进Validator中即可,实现了算法的实现与使用的分离,符合开闭原则。
js设计模式总结-策略模式的更多相关文章
- JS 设计模式三 -- 策略模式
策略模式 概念 定义一系列算法,把它们一个个封装起来. 将算法的使用与算法的实现分离开来 实现 // 加权映射关系 var levelMap = { S: 10, A: 8, B: 6, C: 4 } ...
- 浅谈js设计模式之策略模式
策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- JavaScript设计模式之策略模式【组合委托】
前言:语言只是工具,思想才是核心 今天要总结的是 策略模式 策略在开发中的应用非常广泛,所以也是非常常见且使用的设计模式. 在实际开发中,往往在实现一个功能时,有多种解决方案可行. 常见场景: 解压: ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- JavaScript设计模式之策略模式
所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...
随机推荐
- Magento的基本架构解析
Magento的基本架构解析 magento 是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为 zend框架提供了面向对象的代码库并且有很 ...
- GPS部标监控平台的架构设计(八)-基于WCF的平台数据通信设计
总体来讲,GPS部标平台的软件开发是一个对网络通信和应用程序之间通信的技术应用密集型的开发工作,也是有一定设计技术含量的工作. 1.设计通信接口 在设计的时候,根据职责划分,拆分成不同的应用子系统,对 ...
- Java操作Excel: POI不能创建xlsm问题的方法(源自StackOverFlow)
write to xlsm (Excel 2007) using apache poi POI的下载(记得把其中的jar包全部加到工程里哦)http://mirror.bit.edu.cn/apach ...
- Drawable和Bitmap区别
Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...
- ArcGis for Android 工作与学习
ArcGis安装 需求 windows7(32/64) Eclipse3.6以上版本 Android Sdk 2.2以上 Jdk 7 安装步骤 Eclipse安装 下载ArcGis插件 在Eclips ...
- paper 127:机器学习中的范数规则化之(二)核范数与规则项参数选择
机器学习中的范数规则化之(二)核范数与规则项参数选择 zouxy09@qq.com http://blog.csdn.net/zouxy09 上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮 ...
- Web 播放声音 — AMR(Audio) 篇
本文主要介绍 AMR(Aduio) 播放 AMR 格式 Base64码 音频. 1.必备资料 github AMR 开源库 :https://github.com/jpemartins/amr.js用 ...
- vbs 中文字符串
vbs 字符串包含中文字符,文件以UTF-8无BOM格式保存,就会出现“编译器错误: 未结束的字符串常量”错误,改以ANSI保存就没有这个问题
- Lucene.net应用
1.加入盘古分词方法 /// <summary> /// 对输入的搜索的条件进行分词 /// </summary> /// <param name="str&q ...
- sqlalchemy ORM
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 1. ORM介绍 orm英文全称object ...