JavaScript设计模式之策略模式详解


Posted in Javascript onJune 09, 2017

在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。

这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。

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

/*
 * pre:策略模式
 * 示例:公司计算奖金,分A、B、C 三种绩效,计算方式如下
 * 绩效为A,奖金乘以系数5
 * 绩效为B,奖金乘以系数4
 * 绩效为C,奖金乘以系数3
 */
//-------- 示例1 ----------
var calculateBonus = function(performanceLevel, salary) {
 if(performanceLevel === 'A') {
  return salary * 5;
 }
 if(performanceLevel === 'B') {
  return salary * 4;
 }
 if(performanceLevel === 'C') {
  return salary * 3;
 }
};
console.log(calculateBonus('A', 2000));
/*
 缺点:1、函数体系庞大,拥有太多的if-else语句;
  2、如果增加绩效D,需修改内部函数,违背封闭-开放原则;
  3、复用性差,其他地方如果用到计算奖金,只能赋值黏贴;
 */
//--------- 示例2 ------------
var performanceA = function(salary) {
 return salary * 5;
};
var performanceB = function(salary) {
 return salary * 4;
};
var performanceC = function(salary) {
 return salary * 3;
};
var calculateBonus = function(performanceLevel, salary) {
 if(performanceLevel === 'A') {
  return performanceA(salary);
 }
 if(performanceLevel === 'B') {
  return performanceB(salary);
 }
 if(performanceLevel === 'C') {
  return performanceC(salary);
 }
};
console.log(calculateBonus('A', 2000)); 
/*
 缺点:1、函数体系庞大,系统变化时缺乏弹性
 */
//--------- 示例3 ------------
// 策略模式重构:定义一系列算法,将它们一个个封装起来。
var performanceA = function(){};
performanceA.prototype.caculate = function(salary){
 return salary * 5;
};
var performanceB = function(){};
performanceB.prototype.caculate = function(salary){
 return salary * 4;
};
var performanceC = function(){};
performanceC.prototype.caculate = function(salary){
 return salary * 3;
};

var Bonus = function(){
 this.salary = null;
 this.strategy = null;
};
Bonus.prototype.setSalary = function(salary){
 this.salary = salary;
};
Bonus.prototype.setStrategy = function(strategy){
 this.strategy = strategy;
}
Bonus.prototype.getBonus = function(){
 return this.strategy.caculate(this.salary);
}

var bonus = new Bonus();
bonus.setSalary(2000);
bonus.setStrategy(new performanceA());
console.log(bonus.getBonus());

// ----------- 示例4 ---------------
// javaScript版本
var Strategies = {
 "A":function(salary){
  return salary * 5;
 },
 "B":function(salary){
  return salary * 4;
 },
 "C":function(salary){
  return salary * 3;
 } 
};
var caculateBonus = function(level,salary){
 return Strategies[level](salary);
};
console.log(caculateBonus("A",2000));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
input输入框鼠标焦点提示信息
Mar 17 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
详解jQuery Mobile自定义标签
Jan 06 Javascript
浅谈html转义及防止javascript注入攻击的方法
Dec 04 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
Nov 30 Javascript
vue如何截取字符串
May 06 Javascript
基于VUE的v-charts的曲线显示功能
Oct 01 Javascript
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
Bootstrap Table使用整理(三)
Jun 09 #Javascript
Bootstrap Table使用整理(二)
Jun 09 #Javascript
Bootstrap Table使用整理(一)
Jun 09 #Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 #Javascript
JS实现简易的图片拖拽排序实例代码
Jun 09 #Javascript
jQuery为某个div加入行样式
Jun 09 #jQuery
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 #Javascript
You might like
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
STP的判定过程
2012/10/01 面试题
new修饰符是起什么作用
2015/06/28 面试题
JVM是一个编译程序还是解释程序
2012/09/11 面试题
求职信内容考虑哪几点
2013/10/05 职场文书
大学总结自我鉴定
2014/01/18 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
阿甘正传观后感
2015/06/01 职场文书
委托书范本格式
2019/04/18 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python