策略模式的定义:

将算法一个个的单独进行封装,并且使他们可以相互替换。此模式让算法的变化不会影响到使用算法的客户。

先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的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 --策略模式的更多相关文章

  1. js 策略模式 实现表单验证

    策略模式 简单点说就是:实现目标的方式有很多种,你可以根据自己身情况选一个方法来实现目标. 所以至少有2个对象 .  一个是策略类,一个是环境类(上下文). 然后自己就可以根据上下文选择不同的策略来执 ...

  2. js策略模式vs状态模式

    一.策略模式 1.定义:把一些小的算法,封装起来,使他们之间可以相互替换(把代码的实现和使用分离开来)2.利用策略模式实现小方块缓动 html代码: <div id="containe ...

  3. JS策略模式

    1.策略模式的定义 策略模式又叫算法簇模式,将一组算法分装到一组具体共同接口的独立类或者对象中,它不影响客户端的情况下发生变化. 通常策略模式适用于当一个应用程序需要实现一种特点的服务和功能,而且该程 ...

  4. js设计模式(二)---策略模式

    策略模式: 定义: 定义一系列的算法,把他们一个个封装起来,并且是他们可以相互替换 应用场景: 要求实现某一个功能有多种方案可以选择.比如:条条大路通罗马 实现: 场景,绩效为 S的人年终奖有 4倍工 ...

  5. JS设计模式(2)策略模式

    什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. ...

  6. js设计模式总结-策略模式

    策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...

  7. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  8. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  9. JS常用的设计模式(9)——策略模式

    策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...

随机推荐

  1. 作业——10 分布式文件系统HDFS 练习

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 利用Shell命令与HDFS进行交互 以”./bin/dfs ...

  2. 单点登录(SSO)工作原理

    单点登录(SSO)工作原理 一.单点登录的介绍 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次 ...

  3. Jmeter常用插件:梯度加压/插件管理器

    一.Jmeter梯度加压的 jar:Stepping Thread Group,下载方法如下: 1.访问网网站:https://jmeter-plugins.org/downloads/old/ 2. ...

  4. Centos7搭建FTP服务详细过程

    Centos7搭建FTP服务详细过程https://blog.csdn.net/sinat_30802291/article/details/81706152

  5. Windows10纯净原版系统安装方法

    原文:https://baijiahao.baidu.com/s?id=1626696368732676440&wfr=spider&for=pc 1.先来下载一个纯净的ISO系统安装 ...

  6. thinkphp5---安装到宝塔出现Warning: require(): open_basedir错误

    使用thinkphp5安装到宝塔的linux上,出现以下错误: Warning: require(): open_basedir restriction in effect. File(/www/ww ...

  7. centos7.6环境jenkins升级到tomcat8.0.53和jenkins2.168版本

    Jenkins服务器:192.168.10.175数据备份服务器:192.168.10.164 jenkins服务器报错不能访问,插件无法加载就不能正常获取代码,重启尝试解决无果,于是采用 如下方案: ...

  8. 2-4 【接口Interface Flex布局】让顶部导航滚动

    可以把复杂的类型做命名.例如接口中没有定义年龄,在定义person的时候 如果写了age那么就会报错.因为我们接口中并没有定义年龄. 可选属性,只读属性 新的布局方式 下面这里menu设置类型为Top ...

  9. [LeetCode] 246. Strobogrammatic Number 对称数

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  10. IEDA中使用阿里插件Alibaba Cloud Toolkit和Arthas(阿尔萨斯)

    在 IntelliJ IDEA 中安装和配置 Cloud Toolkit 在 IntelliJ IDEA 中安装和配置 Cloud Toolkit 后,您可以将本地应用快速部署到阿里云 ECS.EDA ...