策略模式
1 概述
- 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。
- 策略模式通过将算法的实现与算法的使用分离,使得算法可以独立于使用它的客户端而变化。
2 优缺点及应用场景
2.1 优点
- 1)算法的独立性:可以独立于客户端变化而变化,提供了算法的可扩展性。
- 2)避免使用多重条件语句:通过策略模式可以避免使用复杂的多重条件语句。
- 3)遵循开闭原则:可以在不修改已有代码的情况下,增加新的算法。
2.2 缺点
- 1)客户端必须知道所有策略:客户端需要知道所有的策略,并且自行决定使用哪一个策略。
- 2)增加对象数量:每一个具体策略都是一个类,会增加类的数量。
2.3 应用场景
- 1)需要使用多个变体的算法:系统需要在运行时动态地选择算法的场景。
- 2)算法的使用频繁变化:需要频繁更改或扩展算法的场景。
- 3)消除条件语句:需要用策略模式来替代复杂的条件分支语句的场景。
3 结构
- 1)策略(Strategy):定义算法的接口。
- 2)具体策略(ConcreteStrategy):实现策略接口的具体算法。
- 3)上下文(Context):维护一个策略对象的引用,定义了客户端需要的接口。
4 实现
4.1 UML 类图

4.2 代码示例
interface Strategy {
public int doOperation(int num1, int num2);
}
class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
5 总结
- 策略模式通过定义一系列算法并将每个算法封装起来,使它们可以互相替换,从而实现算法的独立变化。策略模式适用于需要使用多个变体的算法、算法的使用频繁变化以及消除条件语句的场景。尽管策略模式提高了系统的灵活性和可扩展性,但也增加了客户端对所有策略的了解和管理。在实际应用中,需要根据具体需求合理使用策略模式,以实现灵活可扩展的系统设计。