策略模式(Strategy Pattern)是一种行为设计模式,它使得你可以定义一系列算法,并将每个算法封装在一个类中,使得它们可以互换使用。策略模式使得算法可以独立于使用它的客户端进行变化。通过使用组合而不是继承,你可以动态改变算法的行为。
策略模式通常涉及三个关键部分:
- 策略接口(Strategy Interface):这是一个通用接口,它定义了所有支持的算法的公共操作。所有的策略类都实现此接口。
- 具体策略类(Concrete Strategy Classes):实现策略接口的类,每个类封装了一个支持的算法。
- 上下文(Context):使用策略接口的类。它维护对策略对象的引用,可以定义一个方法来设置策略,并可以有一个执行策略的方法。
如何实现策略模式
以下是在Java中实现策略模式的步骤和示例。
- 定义策略接口:
1public interface Strategy {
2 void execute();
3}
- 创建具体策略类:
1public class ConcreteStrategyA implements Strategy {
2 @Override
3 public void execute() {
4 System.out.println("执行策略 A");
5 }
6}
7
8public class ConcreteStrategyB implements Strategy {
9 @Override
10 public void execute() {
11 System.out.println("执行策略 B");
12 }
13}
- 实现上下文类:
1public class Context {
2 private Strategy strategy;
3
4 // 设置策略
5 public void setStrategy(Strategy strategy) {
6 this.strategy = strategy;
7 }
8
9 // 执行策略
10 public void executeStrategy() {
11 strategy.execute();
12 }
13}
- 客户端使用策略:
1public class Demo {
2 public static void main(String[] args) {
3 Context context = new Context();
4
5 // 使用策略A
6 Strategy strategyA = new ConcreteStrategyA();
7 context.setStrategy(strategyA);
8 context.executeStrategy();
9
10 // 切换到策略B
11 Strategy strategyB = new ConcreteStrategyB();
12 context.setStrategy(strategyB);
13 context.executeStrategy();
14 }
15}
在这个例子中,客户端代码创建了一个Context对象,并且可以通过调用setStrategy()来改变其策略。在executeStrategy()被调用时,上下文将使用其当前策略中的execute()方法。