策略模式的定义:

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

先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的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. MyBatis你只写了接口为啥就能执行SQL啊?

    一.静态代理 又是一年秋招季,很多小伙伴开始去大城市打拼.来大城市第一件事就是租房,免不了和中介打交道,因为很多房东很忙,你根本找不到他.从这个场景中就可以抽象出来代理模式: ISubject:被访问 ...

  2. Jmeter命令行运行配置环境变量

    Jmeter命令行运行配置环境变量 在打开jmeter GUI界面时会弹出cmd命令窗口提示:压测时不要用GUI,要用命令行 在cmd命令行里面运行jmeter的话,需要配置jmeter环境变量,下面 ...

  3. Oracle系列八 高级子查询

    子查询 子查询 (内查询) 在主查询执行之前执行 主查询(外查询)使用子查询的结果 多列子查询 主查询与子查询返回的多个列进行比较 多列子查询中的比较分为两种: 成对比较 问题:查询与141号或174 ...

  4. 2-3 【初识组件】顶部 TabBar

    VsCode中使用Emmet神器快速编写HTML代码 1 根组件下面包含了很多的子组件 组件就是控制屏幕的某一个部分,某一个区域 组件是可以相互包含的 组件是定义在类里面的,类里面有属性和方法 注解会 ...

  5. Oracle:Pivot 转多列并包含多个名称

    SELECT * FROM (SELECT l.DISTRIBUTOR_ID, d.SKU_CODE, d.WH_CODE, d.ORDER_PACKAGES, d.PRICE, d.YEARLY|| ...

  6. 【翻译】Flink Table Api & SQL —— 连接到外部系统

    本文翻译自官网:Connect to External Systems  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev ...

  7. H5混合开发中android终端和ios终端常见的兼容问题1

    转自 https://blog.csdn.net/xuehu837769474/article/details/80603898 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上 ...

  8. 面试之哈希表leetcode

    1 案例1 leetcode-----242 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t ...

  9. 【vim小记】vim的高效移动

    我还是推荐所有刚入门vim的朋友先去用vimtutor练习,然后去看vim的帮助文档,写的十分仔细,而且可以马上实战,见效很快,以下的很多示意图都是vim帮助文档里的例子,我觉得很好,就拿出来了. v ...

  10. LeetCode 788. 旋转数字(Rotated Digits) 36

    788. 旋转数字 788. Rotated Digits 题目描述 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数.要求每位数字 ...