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 相关文章推荐
use jscript List Installed Software
Jun 11 Javascript
精通Javascript系列之Javascript基础篇
Jun 07 Javascript
JavaScript中变量提升 Hoisting
Jul 03 Javascript
JS方法调用括号的问题探讨
Jan 24 Javascript
jQuery表格排序组件-tablesorter使用示例
May 26 Javascript
常用DOM整理
Jun 16 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
Mar 04 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
Jul 28 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
Jul 26 Javascript
vue+iview实现手机号分段输入框
Mar 25 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
正则表达式语法
2006/10/09 Javascript
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
用javascript实现给图片加链接
2007/08/15 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
AngularJS内置指令
2015/02/04 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
Zabbix实现微信报警功能
2016/10/09 Python
Python 数据结构之队列的实现
2017/01/22 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
python集合是否可变总结
2019/06/20 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
高级Java程序员面试题
2016/06/23 面试题
自我推荐书
2013/12/04 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
护士找工作求职信
2014/07/02 职场文书
法定授权委托证明书
2015/06/18 职场文书
MySQL数据库事务的四大特性
2022/04/20 MySQL