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 编写规范
Mar 03 Javascript
jquery获取当前点击对象的value方法
Feb 28 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
程序员必知35个jQuery 代码片段
Nov 05 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
angular使用bootstrap方法手动启动的实例代码
Jul 18 Javascript
Node.js自定义实现文件路由功能
Sep 22 Javascript
express+mockjs实现模拟后台数据发送功能
Jan 07 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
Feb 15 jQuery
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
js数组的基本使用总结
Jan 18 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python实现telnet服务器的方法
2015/07/10 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
俄语专业毕业生推荐信
2013/10/28 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
重阳节登山活动方案
2014/02/03 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
如何写好建议书
2014/03/13 职场文书
成龙洗发水广告词
2014/03/14 职场文书
2015年店长个人工作总结
2015/10/23 职场文书