本文深入解析JavaScript中的策略模式,通过计算奖金的实例,展示如何将一系列算法封装为独立对象。重点对比传统if-else写法与策略对象模式的优劣,阐述如何利用策略模式消除复杂的条件分支,提升代码的可扩展性与可维护性。
策略模式的核心定义与应用场景
在软件开发过程中,实现特定业务目标往往存在多种不同的算法路径。
这些备选方案各具特点且灵活多变,彼此之间可以无缝切换。这种允许算法独立变化并相互替换的设计思路,即构成了策略模式的核心概念。
策略模式的规范定义指出:应当定义一组算法,将它们分别封装在独立的对象中,并确保这些算法之间具备相互替换的能力。
从if-else到策略对象的代码重构
/*
* 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));
综上所述,本文旨在帮助读者深入理解策略模式的实际应用价值,期待对各位的技术学习有所助益,同时也欢迎持续关注本站以获取更多技术分享。