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 ...
随机推荐
- Sql注入基本思路
Sql注入基本思路 利用mysql自己动手 登录 使用show databases;查看数据库,sql注入主要用到的是information_schema这个库(mysql中大小写不敏感) infor ...
- docker容器启动后添加端口映射
DOCKER 给运行中的容器添加映射端口 方法1 1.获得容器IP 将container_name 换成实际环境中的容器名 docker inspect `container_name` | grep ...
- ZooKeeper和ZAB协议
前言 ZooKeeper是一个提供高可用,一致性,高性能的保证读写顺序的存储系统.ZAB协议为ZooKeeper专门设计的一种支持数据一致性的原子广播协议. 演示环境 $ uname -a Darwi ...
- 单细胞数据normalization方法 | SCTransform
SCTransform Normalization and variance stabilization of single-cell RNA-seq data using regularized n ...
- 【转】Python访问oracle数据库,DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found"
使用python连接Oracle,出现如下错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified ...
- rConfig v3.9.2 授权认证与未授权RCE (CVE-2019-16663) 、(CVE-2019-16662)
rConfig v3.9.2 authenticated and unauthenticated RCE (CVE-2019-16663) and (CVE-2019-16662) 原文:https: ...
- 不借助其他任何软件防止QQ被盗的小技巧
分享一个小技巧(防止QQ被盗号): 在登录的时候前面加个0,点击登录,如果显示账号不存在,是因为你没有在添加或注册账号这儿登录,也就是切换账号.PC端也可以,如下图: ...
- [转帖]Latch
Latch (转) http://blog.csdn.net/tianlesoftware/article/details/5263238 2013-05-24 15:33:09 huashanlun ...
- 33 Eclipse无法查看源码解决
问题如图 点击 Attach Source 解决方法 下载src.zip包,src包地址:https://pan.baidu.com/s/1oAqqqHO 选择此src包即可
- TensorFlow学习笔记(1)—— 基本概念与框架
入门框架时的常见问题 学习框架的原因? 方便.易用 学习框架的哪些知识点? 掌握一个项目的基本流程,就知道需要学习哪些知识点了 迅速学习框架的方法 根据项目每块流程的需要针对性的学 可以看官方的入门教 ...