设计模式-策略模式

简介

策略模式是一种行为设计模式,它使得你可以在运行时选择算法或行为的模式。在JavaScript中,策略模式通常用于定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式使得算法可以独立于使用它们的客户端变化。

特点

  • 定义了算法族,分别封装起来,使它们之间可以互相替换。
  • 此模式让算法的变化独立于使用算法的用户。
  • 客户端代码必须知道所有的策略类,并自行决定使用哪一个策略类。

策略模式的实现

  • 策略接口:定义了一个公共接口,所有的策略类都必须实现这个接口。
  • 具体策略类:实现了策略接口,封装了具体的算法或行为。
  • 上下文类(Context):持有一个策略对象的引用,并调用该策略对象的算法。
javascript 复制代码
// 定义策略接口(在JavaScript中通过函数实现)  
function calcBonusInterface(salary) {  
    throw new Error('子类必须实现这个方法');  
}  
  
// 定义具体策略类  
function LevelSPolicy(salary) {  
    return salary * 4; // 绩效S的奖金系数为4  
}  
  
function LevelAPolicy(salary) {  
    return salary * 3; // 绩效A的奖金系数为3  
}  
  
function LevelBPolicy(salary) {  
    return salary * 2; // 绩效B的奖金系数为2  
}  
  
// 上下文类  
function SalaryCalculator(policy) {  
    this.policy = policy;  
}  
  
SalaryCalculator.prototype.setPolicy = function(policy) {  
    this.policy = policy;  
};  
  
SalaryCalculator.prototype.calculate = function(salary) {  
    return this.policy(salary);  
};  
  
// 使用示例  
var calculator = new SalaryCalculator(LevelSPolicy);  
console.log(calculator.calculate(10000)); // 输出 40000  
  
calculator.setPolicy(LevelAPolicy);  
console.log(calculator.calculate(10000)); // 输出 30000

优点

  • 灵活性和可扩展性:策略模式使得算法可以独立于使用它的客户端变化。当增加新的算法时,只需要增加一个新的策略类,而不需要修改现有的代码。
  • 简化单元测试:每个策略都是一个独立的类,可以单独进行单元测试。
  • 避免使用多重条件语句 :策略模式可以避免在客户端代码中使用复杂的if-else或switch-case语句来选择不同的算法

缺点

  • 客户端必须知道所有的策略类:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这可能会增加客户端的复杂性。
  • 策略类数量可能会很多:如果系统中有很多算法,那么就需要定义很多策略类,这可能会增加系统的复杂性。

总结

在JavaScript中,策略模式通过定义一系列算法或行为,并在运行时根据需要进行切换,来提供灵活的控制。这种模式有助于代码的组织和维护,使得各种算法或行为的更改更加独立和灵活。

相关推荐
吃青椒的小新17 分钟前
独一无二的设计模式——单例模式(Java实现)
java·后端·单例模式·设计模式
小小写14 小时前
设计模式-状态模式和策略模式
设计模式·状态模式·策略模式
一大颗萝卜21 小时前
【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展
java·spring·设计模式·简单工厂模式·策略模式·模板方法模式·开闭原则
明戈戈1 天前
设计模式-观察者模式
java·观察者模式·设计模式
handsomethefirst1 天前
【设计模式】【行为型模式】【责任链模式】
设计模式·责任链模式
白色的生活1 天前
设计模式学习-《策略模式》
学习·设计模式·策略模式
Eric⠀1 天前
【02问:前端常见的设计模式】
前端·javascript·vue.js·设计模式·js
java6666688881 天前
工厂设计模式的实现与应用场景分析
设计模式
xintaiideas1 天前
熟练掌握 Java 设计模式,如工厂、代理、策略、责任链等设计模式,并善⽤设计原则构建可复⽤代码
java·开发语言·设计模式
繁星十年1 天前
在C++中,工厂模式的思考(《C++20设计模式》及常规设计模式对比)
c++·设计模式·c++20