JavaScript设计模式_02_策略模式
在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
/*
* 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设计模式_02_策略模式的更多相关文章
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- JavaScript设计模式之策略模式
所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...
- JavaScript设计模式(策略模式)
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来 ...
- 第二章 --- 关于Javascript 设计模式 之 策略模式
这一章节里面,我们会主要的针对JavaScript中的策略模式进行理解和学习 一.定义 策略模式: 定义一系列的算法,把他们封装起来,并且是他们可以相互替换. (这样的大的定义纲领,真的不好理解,特别 ...
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...
- JavaScript设计模式之策略模式【组合委托】
前言:语言只是工具,思想才是核心 今天要总结的是 策略模式 策略在开发中的应用非常广泛,所以也是非常常见且使用的设计模式. 在实际开发中,往往在实现一个功能时,有多种解决方案可行. 常见场景: 解压: ...
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- 理解javascript中的策略模式
理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
随机推荐
- C# treeview 使用笔记
treeView默认 展开 treeView1.ExpandAll(); treeview判断点击节点: private void treeView1_AfterSelect(object sende ...
- zlog学习随笔
zlog1使用手册 Contents Chapter 1 zlog是什么? 1.1 兼容性说明 1.2 zlog 1.2 发布说明 Chapter 2 zlog不是什么? Chapter 3 ...
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- OpenGL 的空间变换(上):矩阵在空间几何中的应用
在使用 OpenGL 的应用程序中,当我们指定了模型的顶点后,顶点依次会变换到不同的 OpenGL 空间中,最后才会被显示到屏幕上.在变换的过程中,通过使用矩阵,我们更高效地来完成这些变换工作. 本篇 ...
- 为linux安装xen-tools提示/dev/xvdd does not exist
看样子百度还是不如google啊.百度上找到的信息完全无用.google上却给我找到了... 1:当/dev/xvdd does not exist错误出现时,可以尝试下 mount /dev/cdr ...
- Centos 7 安装mysql后出现 ERROR 2002 (HY000)解决方案
Centos 7 安装mysql后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib ...
- 悬挂else引发的问题
这个问题虽然已经为人熟知,而且也并非C语言所独有,但即使是有多年经验的C程序员也常常在此失误过. 考虑下面的程序片段: if (x == 0) if (y == 0) error(); else{ z ...
- cas错误:org.jasig.cas.client.validation.TicketValidationException: No principal was found in the response from the CAS server.
这个问题困扰了我好几天,最终被这个哥们解决了,具体请参考:http://www.oschina.net/question/252484_149958?sort=time
- django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)
Nginx静态资源无法加载,导致admin没有CSS样式: 这个问题,主要是要理解: 1.Django不会去解析静态内容(css,js,img)等,而是交给Nginx去处理,所以nginx.conf要 ...
- PAT1029.Median (25)
(一)题目 题目链接:https://www.patest.cn/contests/pat-a-practise/1029 1029. Median (25) Given an increasing ...