策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式使得算法可以在不影响客户端的情况下发生变化。
在Java中实现策略模式通常涉及以下几个步骤:
-
定义策略接口:定义一个策略接口或抽象类,声明所有具体策略必须实现的方法。
-
实现具体策略:实现策略接口的具体类,每个类提供不同的算法实现。
-
创建上下文类:创建一个上下文类,它持有一个策略接口的引用,并通过该引用调用策略的方法。
下面是一个简单的Java示例,展示了如何实现策略模式:
```java
// 1. 定义策略接口
interface Strategy {
int execute(int a, int b);
}
// 2. 实现具体策略
class AddStrategy implements Strategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}
class SubtractStrategy implements Strategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}
class MultiplyStrategy implements Strategy {
@Override
public int execute(int a, int b) {
return a * b;
}
}
// 3. 创建上下文类
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.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(new AddStrategy());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context.setStrategy(new SubtractStrategy());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context.setStrategy(new MultiplyStrategy());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
```
代码说明:
- Strategy接口:定义了
execute
方法,所有具体策略类都要实现这个方法。 - 具体策略类:
AddStrategy
、SubtractStrategy
和MultiplyStrategy
分别实现了加法、减法和乘法策略。 - Context类:持有一个
Strategy
对象的引用,并提供了setStrategy
方法用于动态改变策略,以及executeStrategy
方法用于执行当前策略。 - StrategyPatternDemo类:演示了如何使用策略模式,通过改变
Context
对象的策略来执行不同的算法。
这种设计模式的优点在于它遵循了开闭原则(对扩展开放,对修改关闭),可以轻松地添加新的策略而不必修改现有的代码。