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 相关文章推荐
javascript 面向对象编程基础:继承
Aug 21 Javascript
javascript实现多级联动下拉菜单的方法
Feb 06 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
Nov 09 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 Javascript
基于axios封装fetch方法及调用实例
Feb 05 Javascript
JS 实现分页打印功能
May 16 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 Javascript
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
Vue搭建后台系统需要注意的问题
Nov 08 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 Javascript
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
编译问题
2006/10/09 PHP
PHP脚本数据库功能详解(中)
2006/10/09 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
PHP类型约束用法示例
2016/09/28 PHP
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
报关简历自我评价怎么写
2013/09/19 职场文书
社区母亲节活动方案
2014/03/05 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2014年底工作总结
2014/12/15 职场文书
庆七一晚会主持词
2015/06/30 职场文书
安全温馨提示语大全
2015/07/14 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
MongoDB支持的索引类型
2022/04/11 MongoDB