推荐答案
// www.javascriptcn.com code example
// 定义策略接口
class Strategy {
execute(a, b) {
throw new Error("This method must be overridden");
}
}
// 具体策略A
class AddStrategy extends Strategy {
execute(a, b) {
return a + b;
}
}
// 具体策略B
class SubtractStrategy extends Strategy {
execute(a, b) {
return a - b;
}
}
// 具体策略C
class MultiplyStrategy extends Strategy {
execute(a, b) {
return a * b;
}
}
// 上下文类
class Context {
constructor(strategy) {
this.strategy = strategy;
}
setStrategy(strategy) {
this.strategy = strategy;
}
executeStrategy(a, b) {
return this.strategy.execute(a, b);
}
}
// 使用示例
const context = new Context(new AddStrategy());
console.log(context.executeStrategy(5, 3)); // 输出: 8
context.setStrategy(new SubtractStrategy());
console.log(context.executeStrategy(5, 3)); // 输出: 2
context.setStrategy(new MultiplyStrategy());
console.log(context.executeStrategy(5, 3)); // 输出: 15本题详细解读
策略模式的定义
策略模式(Strategy Pattern)是一种行为设计模式,它允许你定义一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。
策略模式的结构
- 策略接口(Strategy):定义所有支持的算法的公共接口。通常是一个抽象类或接口。
- 具体策略(Concrete Strategy):实现策略接口的具体算法类。
- 上下文(Context):持有一个策略对象的引用,并通过策略接口与具体策略进行交互。
代码解析
- 策略接口:
Strategy类定义了一个execute方法,所有具体策略类都必须实现这个方法。 - 具体策略:
AddStrategy、SubtractStrategy和MultiplyStrategy分别实现了execute方法,提供了不同的算法实现。 - 上下文类:
Context类持有一个策略对象的引用,并通过executeStrategy方法调用策略对象的execute方法。setStrategy方法允许在运行时更改策略。
使用场景
策略模式适用于以下场景:
- 当一个系统需要在运行时动态选择算法时。
- 当一个类有多种行为,并且这些行为在类的操作中以多个条件语句的形式出现时。
- 当需要将算法的使用与算法的实现分离时。
优点
- 灵活性:可以在运行时切换算法。
- 可扩展性:可以轻松添加新的策略,而不影响现有代码。
- 避免条件语句:通过使用策略模式,可以避免使用大量的条件语句来选择算法。
缺点
- 增加对象数量:每个具体策略都是一个类,可能会增加系统中对象的数量。
- 客户端必须了解策略:客户端需要知道不同的策略之间的区别,以便选择合适的策略。