js --策略模式
策略模式的定义:
将算法一个个的单独进行封装,并且使他们可以相互替换。此模式让算法的变化不会影响到使用算法的客户。
先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的is-else语句进行判断,或者使用switch语句,在后期添加新的需求的时候,比较头疼的需要去改这些判断语句,而且有时候会,添加一条判断语句,一不小心会导致所有的判断都失效呢?举一个之前项目中用到的例子把,简化一下。有一个按钮在不同的条件下,跳转到不同的页面,如下:
toseeHouse() {
switch(this.activeIndex){
case :uni.navigateTo({
url: '/0'
});
break;
case :uni.navigateTo({
url: '/1'
});
break;
case :uni.navigateTo({
url: '/2'
});
break;
case :uni.navigateTo({
url: '/3'
});
break;
}
},
这段代码带来的问题主要是在增加新的需求的时候,我们还需要修改这段代码的整体逻辑。
然后根据策略模式,我们将一系列的算法单独封装出去,使用哪个,调用哪个方法。
JavaScript版本的策略模式
let obj = {
'': function() {
return ''
},
'': function() {
return ''
},
'': function() {
return ''
}
}
console.log('', obj['']()) //0
这样,就避免了if-else 语句的判断,如果增加了新的业务逻辑,我们可以直接修改算法,而不会影响用户的使用。
使用策略模式重构代码,可以消除程序中大片的条件分支语句。在实际开发的过程中,我们通常会把算法的含义扩散开来,是策略模式也可以封装一系列的“业务规则”。只要这些业务规则的指向的目标一致,并且可以被替换使用,我们就可以使用策略模式来封装他们。
在举一个在网上看到的例子,应该算是比较经典的把,因为 好多博客中都以这个例子为例,就是计算奖金的这个例子。
传统版的策略模式:
var performanceA = function() {
}
performanceA.prototype.calculate = function(salary) {
return salary*;
}
var performanceB = function() {}
performanceB.prototype.calculate = function(salary) {
return salary*
}
var performanceC = function() {}
performanceC.prototype.calculate = function(salary) {
return salary*
}
//奖金类
var Bouns = function() {
this.salary = null; //原始工资
this.levelObj = null; //绩效等级对应的策略模式
}
Bouns.prototype.setSalary = function(salary) {
// 保存员工的原始工资
this.salary = salary;
}
Bouns.prototype.setlevelObj = function(levelObj) {
// 设置员工绩效等级对应的策略模式
this.levelObj = levelObj;
}
Bouns.prototype.getBouns = function() {
// 把计算奖金的操作委托给对应的策略对象
return this.levelObj.calculate(this.salary)
}
var bouns = new Bouns();
bouns.setSalary();
bouns.setlevelObj(new performanceA());
console.log(bouns.getBouns()) // 4000
bouns.setlevelObj(new performanceB())
console.log(bouns.getBouns()) // 3000
策略模式 应该至少由两部分组成,一部分使策略类,就是里面封装了具体的算法。并且负责具体的计算过程。第二个部门就是环境类Context。该Contex接收客户的请求,然后把请求委托给符合要求的某一个策略类。
策略模式的优点:
优点:
- 避免使用大量的if-else语句,使代码块简洁,易读。
- 符合设计原则中的开放-封闭原则,面向扩展开放,面向修改关闭。
- 复用性高
缺点:
- 增加了许多策略类或者策略对象
总结:
策略模式定义了一系列的算法,从概念上讲,所有的这些算法都是做相同的事情,只是实现不同,他可以以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合。
js --策略模式的更多相关文章
- js 策略模式 实现表单验证
策略模式 简单点说就是:实现目标的方式有很多种,你可以根据自己身情况选一个方法来实现目标. 所以至少有2个对象 . 一个是策略类,一个是环境类(上下文). 然后自己就可以根据上下文选择不同的策略来执 ...
- js策略模式vs状态模式
一.策略模式 1.定义:把一些小的算法,封装起来,使他们之间可以相互替换(把代码的实现和使用分离开来)2.利用策略模式实现小方块缓动 html代码: <div id="containe ...
- JS策略模式
1.策略模式的定义 策略模式又叫算法簇模式,将一组算法分装到一组具体共同接口的独立类或者对象中,它不影响客户端的情况下发生变化. 通常策略模式适用于当一个应用程序需要实现一种特点的服务和功能,而且该程 ...
- js设计模式(二)---策略模式
策略模式: 定义: 定义一系列的算法,把他们一个个封装起来,并且是他们可以相互替换 应用场景: 要求实现某一个功能有多种方案可以选择.比如:条条大路通罗马 实现: 场景,绩效为 S的人年终奖有 4倍工 ...
- JS设计模式(2)策略模式
什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. ...
- js设计模式总结-策略模式
策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...
- 3.js模式-策略模式
1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- JS常用的设计模式(9)——策略模式
策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...
随机推荐
- php 调用微信上传临时素材接口 {“errcode”:41005,”errmsg”:”media data missing hint”}
原因:由于PHP5.6以前与之后的版本curl_setopt有差异.PHP5.6以后不再支持”@文件路径”的方式. $picPath= "public\public\upload\xxx.p ...
- 【mybatis源码学习】ResultMap查询结果映射
一.ResultMap包含的元素 constructor - 用于在实例化类时,注入结果到构造方法中 idArg - ID 参数:标记出作为 ID 的结果可以帮助提高整体性能 arg - 将被注入到构 ...
- arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...
- SQL Server case when 实现分类汇总
case when 实现分类汇总
- [转]Maven 国内源配置(2019/2/14)
原文地址:https://segmentfault.com/a/1190000018147680 新年开工后要开始新的项目,但是发现一些项目的依赖没有在阿里仓库Central或Public源之中,项目 ...
- git 比较实用的命令
git 删除已经add 过的文件 使用 git rm 命令即可,有两种选择, 使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删 ...
- WebGL第一步
什么是WebGL? WebGL使用了GLSL ES(OpenGL ES)着色器语言,通过配合调用js相关的绘制接口来实现3D效果. 采用页面中的<canvas>元素来定义绘图区域,canv ...
- java获取ubuntu某个目录下的所有文件信息
java获取ubuntu某个目录下的所有文件信息 public List<VCFile> getAllFiles(String basicDirName) { List<VCFile ...
- shell 判断一个字符串是否由字母数字组成
摘自:http://blog.51cto.com/lynnteng0/804520 describe="it's a describe by yourself" if echo & ...
- Oracle-关于Oracle.ManagedDataAccess
今天调用webservice的时候,运行程序后开始报错以下的错误信息 “/”应用程序中的服务器错误. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项.试图加载格式不正确的 ...