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 相关文章推荐
静态的动态续篇之来点XML
Aug 15 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
javascript中的self和this用法小结
Feb 08 Javascript
Javascript小技巧之生成html元素
May 15 Javascript
js在IE与firefox的差异集锦
Nov 11 Javascript
jquery结合CSS使用validate实现漂亮的验证
Jan 29 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
vue+node实现图片上传及预览的示例方法
Nov 22 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
Mar 10 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
Sep 01 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
PHP Memcached应用实现代码
2010/02/08 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
python合并文本文件示例
2014/02/07 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
某公司.Net方向面试题
2014/04/24 面试题
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
高二生物教学反思
2014/01/27 职场文书
集体备课反思
2014/02/12 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
golang中的struct操作
2021/11/11 Golang