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的划词搜索实现(备忘)
Sep 14 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
Dec 12 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
JavaScript从数组中删除指定值元素的方法
Mar 18 Javascript
实例代码讲解jquery easyui动态tab页
Nov 17 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
详解AngularJS验证、过滤器、指令
Jan 04 Javascript
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
JS多个异步请求 按顺序执行next实现解析
Sep 16 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求正负数数组中连续元素最大值示例
2014/04/11 PHP
php画图实例
2014/11/05 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
js 匿名调用实现代码
2009/06/19 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python写入xml文件的方法
2015/05/08 Python
简单了解Python生成器是什么
2019/07/02 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
Linux的文件类型
2012/03/07 面试题
高级护理实习生自荐信
2013/09/28 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
会议主持人开场白台词
2015/05/28 职场文书
入党后的感想
2015/08/10 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers