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 相关文章推荐
解决Jquery load()加载GB2312页面时出现乱码的两种方案
Sep 10 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
第五章之BootStrap 栅格系统
Apr 25 Javascript
JavaScript中使用Async实现异步控制
Aug 15 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 Javascript
微信小程序实现滑动操作代码
Apr 23 Javascript
react-intl实现React国际化多语言的方法
Sep 27 Javascript
react如何快速设置文件路径别名
Apr 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
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
跟老齐学Python之模块的加载
2014/10/24 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python中关于for循环的碎碎念
2017/06/30 Python
使用python实现tcp自动重连
2017/07/02 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
在keras里实现自定义上采样层
2020/06/28 Python
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
毕业生的求职信范文分享
2013/12/04 职场文书
新员工入职感言
2014/02/01 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
新闻报道策划方案
2014/06/11 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
成事在人观后感
2015/06/16 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫