返回

细说策略模式及运用——设计模式系列

前端

策略模式 ,又称政策模式,是面向对象编程中的一种设计模式。它定义了一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。封装的策略算法一般是独立的,策略模式根据输入来调整采用哪个算法。关键是策略的实现和使用分离。

1. 你曾见过的策略模式

现在电子产品种类繁多,尺寸多种多样,充电方式也有很大差异。有些手机或平板电脑的充电器插头是 USB Type-C,有些是 Micro USB,还有些是 Lightning。为了解决充电方式多样性的问题,市面上出现了多种多样的充电线,其中一种是多头充电线。

多头充电线可以同时支持多种充电方式,这种设计其实就运用了策略模式。多头充电线中的每个充电头都可以看作一个策略,根据不同的设备,选择使用不同的充电头。这种设计使得多头充电线可以兼容多种设备,非常方便。

2. 策略模式的优点

策略模式有很多优点,包括:

  • 可重用性: 策略模式可以将算法封装成独立的类,这样就可以在不同的程序中重复使用这些算法。
  • 可扩展性: 策略模式可以很容易地添加新的算法,而不需要修改现有的代码。
  • 可测试性: 策略模式可以很容易地测试,因为算法是独立的。
  • 灵活性: 策略模式可以根据不同的情况选择不同的算法,这使得程序更加灵活。

3. 策略模式的缺点

策略模式也有缺点,包括:

  • 性能开销: 策略模式会带来一些性能开销,因为每次选择算法时都需要进行一次方法调用。
  • 代码复杂度: 策略模式会使代码变得更加复杂,因为需要编写更多的类和方法。
  • 难以理解: 策略模式可能会使代码难以理解,因为需要理解每个策略的实现。

4. 策略模式的应用场景

策略模式可以应用于多种场景,包括:

  • 排序: 策略模式可以用于对数据进行排序,不同的排序算法可以作为策略类。
  • 搜索: 策略模式可以用于对数据进行搜索,不同的搜索算法可以作为策略类。
  • 压缩: 策略模式可以用于对数据进行压缩,不同的压缩算法可以作为策略类。
  • 加密: 策略模式可以用于对数据进行加密,不同的加密算法可以作为策略类。

5. 策略模式的代码示例

public class StrategyPattern {

  public static void main(String[] args) {
    // 定义一个策略接口
    interface Strategy {
      int doOperation(int num1, int num2);
    }

    // 定义一个具体策略类,实现加法运算
    class AddStrategy implements Strategy {
      @Override
      public int doOperation(int num1, int num2) {
        return num1 + num2;
      }
    }

    // 定义一个具体策略类,实现减法运算
    class SubtractStrategy 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);
      }
    }

    // 使用策略模式
    Context context = new Context(new AddStrategy());
    int result = context.executeStrategy(10, 5);
    System.out.println("10 + 5 = " + result);

    context = new Context(new SubtractStrategy());
    result = context.executeStrategy(10, 5);
    System.out.println("10 - 5 = " + result);
  }
}

在这个例子中,Strategy接口定义了一个doOperation方法,用于执行策略。AddStrategySubtractStrategy是两个具体策略类,分别实现了加法和减法运算。Context类是策略上下文类,它包含一个Strategy对象。executeStrategy方法使用Strategy对象来执行策略。

6. 总结

策略模式是一种非常有用的设计模式,它可以使代码更加灵活、可扩展和可测试。策略模式的应用场景也非常广泛,包括排序、搜索、压缩、加密等。