目录
前言
1、策略介绍
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。
如下所示:
策略模式使得算法可以独立于使用它的客户端而变化。
2、特点
2.1、优缺点
1、策略模式优点:
策略类之间可以自由切换:
由于策略类都实现同一个接口,所以使它们之间可以自由切换。避免使用多重条件选择语句(if else),充分体现面向对象设计思想。
易于扩展:
增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“。
2、策略模式缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式将造成产生很多策略类。
2.2、和工厂模式对比
如下所示:
3、实现
下面是策略模式的一个简单实现示例:
假设我们有一个计算器应用程序,可以执行不同的运算策略(例如加法、减法、乘法、除法)。我们可以使用策略模式来实现这些运算。
1、定义策略接口:
public interface OperationStrategy {
int execute(int a, int b);
}
2、实现具体策略:
public class AdditionStrategy implements OperationStrategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}
public class SubtractionStrategy implements OperationStrategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}
public class MultiplicationStrategy implements OperationStrategy {
@Override
public int execute(int a, int b) {
return a * b;
}
}
public class DivisionStrategy implements OperationStrategy {
@Override
public int execute(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("Cannot divide by zero");
}
return a / b;
}
}
3、使用策略上下文:
public class CalculatorContext {
private OperationStrategy strategy;
public void setStrategy(OperationStrategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
4、客户端代码:
public class StrategyPatternDemo {
public static void main(String[] args) {
CalculatorContext calculator = new CalculatorContext();
calculator.setStrategy(new AdditionStrategy());
System.out.println("Addition: " + calculator.executeStrategy(5, 3));
calculator.setStrategy(new SubtractionStrategy());
System.out.println("Subtraction: " + calculator.executeStrategy(5, 3));
calculator.setStrategy(new MultiplicationStrategy());
System.out.println("Multiplication: " + calculator.executeStrategy(5, 3));
calculator.setStrategy(new DivisionStrategy());
System.out.println("Division: " + calculator.executeStrategy(6, 3));
}
}
总结
策略模式通过将算法封装在独立的策略类中,实现了算法的解耦和动态选择。它提高了代码的灵活性和可维护性,特别是在需要频繁切换或扩展算法的场景中。
参考文章: