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获取select的value和text值的简单实例
Feb 26 Javascript
使用npm发布Node.JS程序包教程
Mar 02 Javascript
jquery实现的动态回到顶部特效代码
Oct 28 Javascript
jQuery自动完成插件completer附源码下载
Jan 04 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
mpvue实现左侧导航与右侧内容的联动
Oct 21 Javascript
JS运算符简单用法示例
Jan 19 Javascript
js中Map和Set的用法及区别实例详解
Feb 15 Javascript
JS实现数组去重的11种方法总结
Apr 04 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
轻松修复Discuz!数据库
2008/05/03 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
vue使用自定义指令实现拖拽
2021/01/29 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
使用Kivy将python程序打包为apk文件
2017/07/29 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
2015年校务公开工作总结
2015/05/26 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
企业文化学习心得体会
2016/01/21 职场文书