JavaScript 策略模式
什么是策略模式?
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。策略模式将一组算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户端。
简单来说,策略模式的核心思想是:定义一系列算法,将每个算法封装到独立的类中,使它们可以相互替换。
策略模式的关键点
- 将算法的实现和使用分离
- 消除了大量的条件判断语句
- 提高了代码的可维护性和灵活性
策略模式的组成部分
策略模式主要由三部分组成:
- 策略(Strategy): 定义所有支持的算法的通用接口
- 具体策略(ConcreteStrategy): 实现策略接口的具体算法
- 环境(Context): 维护一个对策略对象的引用,负责将客户端请求委派给策略对象
基础实现示例
让我们通过一个简单的价格计算示例来理解策略模式:
// 定义策略接口(在JavaScript中通常是隐式的)
// 具体策略类 - 不同的折扣计算方式
const discountStrategies = {
noDiscount: function(price) {
return price;
},
tenPercentDiscount: function(price) {
return price * 0.9;
},
fivePercentDiscount: function(price) {
return price * 0.95;
},
blackFridayDiscount: function(price) {
return price * 0.7;
}
};
// 上下文类 - 使用策略的环境
class PriceCalculator {
constructor() {
this.discountStrategy = discountStrategies.noDiscount; // 默认策略
}
setStrategy(strategyFunction) {
this.discountStrategy = strategyFunction;
}
calculatePrice(price) {
return this.discountStrategy(price);
}
}
// 客户端代码
const calculator = new PriceCalculator();
// 正常价格,无折扣
console.log(calculator.calculatePrice(100)); // 输出: 100
// 应用10%折扣
calculator.setStrategy(discountStrategies.tenPercentDiscount);
console.log(calculator.calculatePrice(100)); // 输出: 90
// 黑色星期五折扣
calculator.setStrategy(discountStrategies.blackFridayDiscount);
console.log(calculator.calculatePrice(100)); // 输出: 70
为什么要使用策略模式?
策略模式有许多优点,尤其在以下场景中特别有用:
- 避免复杂的条件语句:不必使用大量的 if-else 或 switch 语句
- 遵循开闭原则:可以添加新的策略而无需修改现有代码
- 提高代码可维护性:各个算法被隔离在不同的类中,更易于维护
- 运行时切换算法:可以在程序运行时动态切换算法