设计模式(13/23) - 策略模式

124 阅读3分钟

策略模式

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 类图

策略模式.jpg

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;
  }
}

// 创建 Context 类
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 来查看当它改变策略 Strategy 时的行为变化
    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 总结

  • 策略模式通过定义一系列算法并将每个算法封装起来,使它们可以互相替换,从而实现算法的独立变化。策略模式适用于需要使用多个变体的算法、算法的使用频繁变化以及消除条件语句的场景。尽管策略模式提高了系统的灵活性和可扩展性,但也增加了客户端对所有策略的了解和管理。在实际应用中,需要根据具体需求合理使用策略模式,以实现灵活可扩展的系统设计。