行为型模式-策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装到独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。
策略模式由三个核心角色组成:上下文(
Context
)、策略接口(Strategy
)和具体策略(Concrete Strategy
)。上下文是使用算法的类,它持有一个策略对象,并在运行时调用策略对象的算法;策略接口定义了算法的统一接口,所有具体策略都实现了策略接口,具体策略类封装了具体的算法。
策略模式的工作流程
- 上下文类持有一个策略接口的引用,通过接口与具体策略进行交互。
- 客户端根据需要选择合适的具体策略,并将其传递给上下文类。
- 上下文类在需要执行算法时,调用策略对象的方法。
- 具体策略类实现了策略接口,提供了特定的算法实现。
策略模式的优点
-
算法的独立性:
策略模式将算法封装到独立的类中,使得算法的变化不会影响到使用算法的客户端。
-
可扩展性:
可以通过添加新的具体策略类来扩展系统的算法,符合开闭原则。
-
灵活性:
客户端可以根据需要选择合适的具体策略进行使用,使得系统具有更高的灵活性和可配置性。
策略模式适用场景
- 当一个系统需要动态地在多个算法中选择一种合适的算法时,可以使用策略模式。
- 当一个类有多个相关的算法,并且这些算法可以独立于该类变化时,可以使用策略模式。
策略模式示例
// 策略接口
interface Strategy {
void execute();
}
// 具体策略A
class ConcreteStrategyA implements Strategy {
public void execute() {
System.out.println("Executing strategy A");
}
}
// 具体策略B
class ConcreteStrategyB implements Strategy {
public void execute() {
System.out.println("Executing strategy B");
}
}
// 上下文
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
Context context = new Context();
Strategy strategyA = new ConcreteStrategyA();
Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyA);
context.executeStrategy();
context.setStrategy(strategyB);
context.executeStrategy();
}
}
在上述示例中,Strategy
是策略接口,ConcreteStrategyA
和ConcreteStrategyB
是具体策略类,Context
是上下文类。客户端通过创建不同的具体策略对象,并将其设置到上下文中,然后调用上下文的执行方法来执行相应的算法。
通过策略模式,可以轻松地替换不同的算法实现,而无需修改客户端的代码。策略模式提供了一种优雅的方式来实现算法的选择和切换,同时增加了系统的灵活性和可维护性。