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中常用的SET和GET
Jan 13 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
May 15 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
Dec 31 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
Apr 01 Javascript
ionic实现带字的toggle滑动组件
Aug 27 Javascript
最实用的jQuery分页插件
Oct 09 Javascript
vue.js 初体验之Chrome 插件开发实录
May 13 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
浅谈vue 锚点指令v-anchor的使用
Nov 13 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
php以post形式发送xml的方法
2014/11/04 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
jquery密码强度校验
2015/12/02 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
Python中的自定义函数学习笔记
2014/09/23 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python while 循环使用的简单实例
2016/06/08 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
详解Python进程间通信之命名管道
2017/08/28 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
寄语是什么意思
2014/04/10 职场文书
妇联主席先进事迹
2014/05/18 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android