- 首先,我们定义一个接口:
public interface CalculationStrategy {
int calculate(int a, int b);
}
- 然后,我们为每种运算创建一个类:
public class AddStrategy implements CalculationStrategy {
public int calculate(int a, int b) {
return a + b;
}
}
public class SubtractStrategy implements CalculationStrategy {
public int calculate(int a, int b) {
return a - b;
}
}
public class MultiplyStrategy implements CalculationStrategy {
public int calculate(int a, int b) {
return a * b;
}
}
public class DivideStrategy implements CalculationStrategy {
public int calculate(int a, int b) {
if (b != 0) {
return a / b;
}
throw new ArithmeticException("Cannot divide by zero");
}
}
- 最后,我们创建一个计算器类来使用这些策略:
public class Calculator {
private CalculationStrategy strategy;
public void setStrategy(CalculationStrategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.calculate(a, b);
}
}
- 使用这个计算器:
Calculator calc = new Calculator();
// 执行加法
calc.setStrategy(new AddStrategy());
System.out.println("10 + 5 = " + calc.executeStrategy(10, 5));
// 执行减法
calc.setStrategy(new SubtractStrategy());
System.out.println("10 - 5 = " + calc.executeStrategy(10, 5));
在这个例子中:
- CalculationStrategy 是策略接口
- AddStrategy, SubtractStrategy 等是具体的策略实现
- Calculator 是使用策略的类
策略模式的好处是:
- 如果我们想要添加新的运算(比如求幂),我们只需要创建一个新的策略类,而不需要修改已有的代码。
- 我们可以在运行时改变计算器的行为,而不需要使用复杂的条件语句。
这就是策略模式的核心思想:将算法(在这个例子中是不同的计算方法)封装到独立的类中,使它们可以互相替换。