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 图像裁剪插件Jcrop的简单使用
May 22 Javascript
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
超炫的jquery仿flash导航栏特效
Nov 11 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
Feb 17 Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 Javascript
JavaScript实现带标题的图片轮播特效
May 20 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
分享JavaScript监听全部Ajax请求事件的方法
Aug 28 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 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
DSP接收机前端设想
2021/03/02 无线电
php 文件状态缓存带来的问题
2008/12/14 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
django使用xadmin的全局配置详解
2019/11/15 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
捷克时尚网上商店:OTTO
2018/03/15 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
教师个人发展总结
2015/02/11 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
python对文档中元素删除,替换操作
2022/04/02 Python