策略模式用来代替if else。

策略模式用来解耦策略的定义、创建、使用。实际上,一个完整的策略模式就是由这三个部分组成的。

  • 策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。
  • 策略的创建由工厂类来完成,封装策略创建的细节。
  • 策略模式包含一组策略可选,客户端代码如何选择使用哪个策略,有两种确定方法:编译时静态确定和运行时动态确定。其中,“运行时动态确定”才是策略模式最典型的应用场景。

一、场景应用

现在上游根据具体的应用来发起 「正常下单」,「重新分配」,「物流换单」三个操作,我们需要根据这些操作执行不同的逻辑,如果不用策略模式,那么代码将会写成

  1. if (Action.NORMAL_ORDER.equals(action)) {
  2. new NormalOrderService().doFlow();
  3. } else if (Action.RE_ALLOCATE.equals(action)) {
  4. new ReAllocateServiceService().doFlow();
  5. } else if (Action.CHANGE_ORDER.equals(action)) {
  6. new ChangeOrderService().doFlow();
  7. }

如果有新的Action,那么就要对if else做修改,那怎么用策略模式呢?

  1. 将策略抽象成一个接口

    1. public interface CarrierService {
    2. public void doFlow();
    3. }
  2. 实现策略接口 ```java public class NormalOrderService implements CarrierService{ @Override public void doFlow() {

    1. //正常下单逻辑,这里可以自定义责任链

    } }

public class ReAllocateServiceService implements CarrierService{ @Override public void doFlow() { //重新分配逻辑,这里可以自定义责任链 } }

public class ChangeOrderService implements CarrierService{ @Override public void doFlow() { //物流换单逻辑,这里可以自定义责任链 } }

  1. 3. 定义一个工厂类。工厂类也可以用反射+配置文件的形式,这里简单实现。
  2. ```java
  3. public class CarrierServiceFactory {
  4. public static HashMap<String, CarrierService> map = new HashMap<>();
  5. static {
  6. map.put(Action.NORMAL_ORDER, new NoramlOrderService());
  7. map.put(Action.RE_ALLOCATE, new ReAllocateServiceService());
  8. map.put(Action.CHANGE_ORDER, new ChangeOrderService());
  9. }
  10. public static CarrierService getCarrierService(String action) {
  11. return map.get(action);
  12. }
  13. }
  1. 使用
    1. public class Client {
    2. public static void main(String[] args) {
    3. //这里的action可以做成配置,也可以是上游传下来
    4. String action = "NORMAL_ORDER";
    5. CarrierService carrierService = CarrierServiceFactory.get(action);
    6. carrierService.doFlow();
    7. }
    8. }

JDK中的Arrays#sort的方法就是用的策略模式
sort(T[] a, Comparator<? super T> c)可以对a集合使用自定义的排序规则,只要实现了Comparator接口的实现类就是一种策略。