设计模式 - 策略模式(设计模式介绍系列)(五)

144 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

这篇文章我们讲一下“策略模式”。

策略模式的定义

策略模式其实是定义一些处理逻辑,将这些处理逻辑封装起来,在调用它们的位置可以根据使用场景相互替换。内部的处理逻辑的变化,不会影响使用者。

日常开发时,对于某些应用场景,会存在很多中实现方法,比如说针对一些需要if 结构去判断调用行为的场景,就可以考虑使用策略模式。

说的这些可能比较抽象,但是是策略模式的基本定义,下面我们将结合策略模式的UML 类图和实际应用场景来做具体分析,同时给出示例代码。

策略模式组成

首先给出策略模式的类图:

image.png

组成部分:

  • 抽象策略(Strategy):最主要的策略的定义就是这个了,它定义了一个公共接口action,不同的应用场景定义具体策略实现这个接口,context使用这个接口来实现应用不同处理逻辑的功能。一般来说,抽象策略使用接口或抽象类实现。

  • 具体策略(ConcreteStrategy):继承(或者实现)抽象策略定义的接口,也就是某些具体策略的业务逻辑的具体实现类。

  • 环境(Context):组合的关系,持有一个策略类的引用,然后进行接口调用,实现业务。

实例代码

首先声明应用场景:

最近公司业务发展良好,有大量产品需要运往目的市场,公司正在制定物流方案,有如下几种:

  • 空运

  • 铁路运送

  • 汽车运送

  • 给第三方物流公司运输

传统的方法应该是这样的:

public static void logistics(String mode) {
  if ("air".equals(mode)) {
    System.out.println("空运");
  } else if ("train".equals (mode)) {
    System.out.println("铁路");
  } else if ("truck".equals(mode)) {
    System.out.println("汽车运输");
  } else if ("outsourcing".equals(mode)) {
    System.out.println("物流公司");
  }
}

如果使用策略模式:

  • 抽象策略
public interface Strategy {
  void action();
}
  • 具体策略
public class AirStrategy implements Strategy {
  @Override
  public void action() {
    System.out.println("空运");
  }
}
public class TrainStrategy implements Strategy {
  @Override
  public void action() {
    System.out.println("铁路运输");
  }
}
public class OutsourcingStrategy implements Strategy {
  @Override
  public void action() {
    System.out.println("给第三方物流公司");
  }
}
  • 应用环境上下文
public class Context {
  public void execute(Strategy strategy) {
    strategy.action();
  }
}

总结

参考上面的类图和代码我们可以发现,策略模式的实现也比较清晰明了。

就是顶一个抽象策略,然后由具体的策略来实现,在应用上下文环境中可以随意替换策略。同时策略内部的更改不会影响上下文。