《JavaScript设计模式与开发实践》之策略模式

此文章只是我自己总结下来让自己有一天用到的时候,翻出来复习的,接受指点,但不接受杠,谁怼我,我怼谁....

模式的主旨:将不变的部分和变化的部分隔开 。

定义: 一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

目的:将算法的使用与算法的实现分离开来。

策略模式种有两个概念,策略类与环境类:
策略类: 封装类具体的算法,并负责具体的计算过程;
环境类: 接受客户的请求,随后把请求委托给某一个策略类。


栗子

直接把官方的计算奖金的栗子搬过来。

需求:很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 S 的人年终奖有 4 倍工资,绩效为 A 的人年终奖有 3 倍工资,而绩效为 B 的人年终奖是 2 倍工资。假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖。

在不了解策略模式之前我们实现的方案很可能如下:

var calculateBonus = function( performanceLevel, salary ){
 if ( performanceLevel === 'S' ){
 return salary * 4;
 }
 if ( performanceLevel === 'A' ){
 return salary * 3;
 }
 if ( performanceLevel === 'B' ){
 return salary * 2;
 }
};
calculateBonus( 'B', 20000 ); // 输出:40000
calculateBonus( 'S', 6000 ); // 输出:24000 

但是,今天我们了解类策略模式,用到策略模式之后,我们实现的方案完全可以如下:

var strategies = {
 "S": function( salary ){
 return salary * 4;
 },
 "A": function( salary ){
 return salary * 3;
 },
 "B": function( salary ){
 return salary * 2; 
}
};
var calculateBonus = function( level, salary ){
 return strategies[ level ]( salary );
};
console.log( calculateBonus( 'S', 20000 ) ); // 输出:80000
console.log( calculateBonus( 'A', 10000 ) ); // 输出:30000 

虽然看着代码行数变多了,但是后者的好处那也是显而易见的,在我看来最直观的优势就是,代码逼格提高了好几个档次。


策略模式的优点:
1. 策略模式利用组合、委托和多态技术和思想,可以有效地避免多重条件选择语句;
2. 策略模式提供了对开放——封闭原则的完美支持,将算法封装在独立的环境中,使得它们易于切换,易于理解,易于扩展;
3. 策略模式中的算法也可以复用在系统的其它地方,从而避免许多重复的复制粘贴工作;
4. 在策略模式中利用组合和委托来让 Context 拥有执行算法的能力,这也是继承的一种更轻便的替换方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • javascript设计模式与开发实践 设计模式 每个设计模式我们需要从三点问题入手: 定义 作用 用法与实现 单...
    穿牛仔裤的蚊子阅读 4,296评论 0 13
  • 在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择。比如一个压缩文件的程序,既可以选择zi...
    yufawu阅读 389评论 0 3
  • 工厂模式 单体模式 模块模式 代理模式 职责链模式 命令模式 模板方法模式 策略模式 发布-订阅模式 中介者模式 ...
    HelloJames阅读 1,028评论 0 6
  • 策略模式的定义:定义一系列的算法,把它们意义封装起来,并且使他们可以相互替换。 策略模式计算奖金 奖金发放的场景:...
    kim_jin阅读 301评论 0 1
  • 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 俗话说,条条大路通罗马。在美剧...
    梅梅_1461阅读 437评论 0 2