Java中的策略模式(Strategy Pattern)
策略模式是一种行为设计模式,允许你定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式使得算法独立于使用它们的客户端。
1. 策略模式的结构
策略模式通常由以下几个角色组成:
- 上下文(Context):持有对某个策略对象的引用,通常通过构造函数或者setter方法来注入所需的具体策略。
- 策略接口(Strategy):定义一个接口以供不同的策略实现。
- 具体策略(ConcreteStrategy):实现策略接口的具体类,这些类提供了不同的算法。
策略模式的优点包括:
- 算法的独立性:策略可以独立于客户端而变化。
- 增加新的策略方便:新策略的引入不影响现有代码。
- 清晰的代码结构:策略类分离,使得代码更清晰和可维护。
2. 类图示例
以下是策略模式的类图:
classDiagram
class Context {
-Strategy strategy
+setStrategy(Strategy strategy)
+executeStrategy(data)
}
class Strategy {
<<interface>>
+execute(data)
}
class ConcreteStrategyA {
+execute(data)
}
class ConcreteStrategyB {
+execute(data)
}
Context --> Strategy
Strategy <|-- ConcreteStrategyA
Strategy <|-- ConcreteStrategyB
3. 代码示例
以下是一个简单的示例,演示了策略模式的实现:
// 策略接口
interface Strategy {
int execute(int a, int b);
}
// 具体策略A:加法
class ConcreteStrategyAdd implements Strategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}
// 具体策略B:减法
class ConcreteStrategySubtract implements Strategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}
// 上下文类
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
// 主函数
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context();
// 设置加法策略
context.setStrategy(new ConcreteStrategyAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
// 设置减法策略
context.setStrategy(new ConcreteStrategySubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
}
}
4. 状态图示例
策略模式的状态转变可以用状态图表示:
stateDiagram
[*] --> ConcreteStrategyAdd
ConcreteStrategyAdd --> ConcreteStrategySubtract : changeStrategy()
ConcreteStrategySubtract --> ConcreteStrategyAdd : changeStrategy()
5. 总结
策略模式通过将不同的算法封装为独立的策略类,允许客户端在运行时选择任意一种策略。这种方式增加了代码的复用性和可维护性,使得代码结构更加清晰。在需要频繁切换算法的场景中,策略模式是一个非常合适的解决方案。例如,在支付方式选择、图形绘制算法等场景中,策略模式的灵活性使其成为设计的重要工具。希望本文能够帮助你理解和掌握Java中的策略模式。