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 学习之二 属性相关
Nov 23 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
Jun 20 Javascript
JavaScript中数组对象的那些自带方法介绍
Mar 12 Javascript
javascript多行字符串的简单实现方式
May 04 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
基于js对象,操作属性、方法详解
Aug 11 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 Javascript
浅析JS中NEW的实现原理及重写
Feb 20 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
图书管理程序(三)
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
php获取错误信息的方法
2015/07/17 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
js自定义回调函数
2015/12/13 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
jQuery设计思想
2017/03/07 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
python中requests模块的使用方法
2015/04/08 Python
Python生成数字图片代码分享
2017/10/31 Python
python 将md5转为16字节的方法
2018/05/29 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python中rb含义理解
2020/06/18 Python
Python实现自动整理文件的脚本
2020/12/17 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
校园安全教育广播稿
2014/02/17 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
爱的承诺书
2015/01/20 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python