跳到主要内容

策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并使得这些算法可以相互替换,使得客户端代码可以独立于算法的变化而变化。策略模式将每个算法封装成一个类,并使得它们可以互相替换,从而使得客户端代码能够选择不同的算法。

以下是策略模式的一般结构和实现要点:

  1. Context(上下文): 维护一个对策略对象的引用,并可以在运行时切换策略。

  2. Strategy(策略): 定义一个接口,封装了一系列具体算法。

  3. ConcreteStrategy(具体策略): 实现策略接口,具体实现了算法。

以下是一个简单的 JavaScript 示例:

// Context(上下文)
class Context {
constructor(strategy) {
this.strategy = strategy;
}

setStrategy(strategy) {
this.strategy = strategy;
}

executeStrategy() {
this.strategy.execute();
}
}

// Strategy(策略)
class Strategy {
execute() {
throw new Error('execute method must be implemented by concrete strategies.');
}
}

// ConcreteStrategyA(具体策略A)
class ConcreteStrategyA extends Strategy {
execute() {
console.log('Executing Concrete Strategy A');
}
}

// ConcreteStrategyB(具体策略B)
class ConcreteStrategyB extends Strategy {
execute() {
console.log('Executing Concrete Strategy B');
}
}

// 客户端代码
const context = new Context(new ConcreteStrategyA());

context.executeStrategy();
// Output: Executing Concrete Strategy A

context.setStrategy(new ConcreteStrategyB());
context.executeStrategy();
// Output: Executing Concrete Strategy B

在这个例子中,Context 是上下文类,维护了一个对具体策略对象的引用,并提供了切换策略和执行策略的方法。Strategy 是策略接口,定义了算法的执行方法。ConcreteStrategyAConcreteStrategyB 是具体策略类,实现了策略接口,分别表示两种不同的算法。客户端代码通过调用 setStrategy 来切换策略,并通过 executeStrategy 方法执行当前策略的算法。

策略模式的优点包括简化了算法的使用,使得客户端代码与算法的实现解耦。这样,当需要添加新的算法时,只需创建新的具体策略类,而无需修改现有代码。这提高了代码的可维护性和可扩展性。