策略模式用来代替if else。
策略模式用来解耦策略的定义、创建、使用。实际上,一个完整的策略模式就是由这三个部分组成的。
- 策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。
- 策略的创建由工厂类来完成,封装策略创建的细节。
- 策略模式包含一组策略可选,客户端代码如何选择使用哪个策略,有两种确定方法:编译时静态确定和运行时动态确定。其中,“运行时动态确定”才是策略模式最典型的应用场景。
一、场景应用
现在上游根据具体的应用来发起 「正常下单」,「重新分配」,「物流换单」三个操作,我们需要根据这些操作执行不同的逻辑,如果不用策略模式,那么代码将会写成
if (Action.NORMAL_ORDER.equals(action)) {new NormalOrderService().doFlow();} else if (Action.RE_ALLOCATE.equals(action)) {new ReAllocateServiceService().doFlow();} else if (Action.CHANGE_ORDER.equals(action)) {new ChangeOrderService().doFlow();}
如果有新的Action,那么就要对if else做修改,那怎么用策略模式呢?
将策略抽象成一个接口
public interface CarrierService {public void doFlow();}
实现策略接口 ```java public class NormalOrderService implements CarrierService{ @Override public void doFlow() {
//正常下单逻辑,这里可以自定义责任链
} }
public class ReAllocateServiceService implements CarrierService{ @Override public void doFlow() { //重新分配逻辑,这里可以自定义责任链 } }
public class ChangeOrderService implements CarrierService{ @Override public void doFlow() { //物流换单逻辑,这里可以自定义责任链 } }
3. 定义一个工厂类。工厂类也可以用反射+配置文件的形式,这里简单实现。```javapublic class CarrierServiceFactory {public static HashMap<String, CarrierService> map = new HashMap<>();static {map.put(Action.NORMAL_ORDER, new NoramlOrderService());map.put(Action.RE_ALLOCATE, new ReAllocateServiceService());map.put(Action.CHANGE_ORDER, new ChangeOrderService());}public static CarrierService getCarrierService(String action) {return map.get(action);}}
- 使用
public class Client {public static void main(String[] args) {//这里的action可以做成配置,也可以是上游传下来String action = "NORMAL_ORDER";CarrierService carrierService = CarrierServiceFactory.get(action);carrierService.doFlow();}}
JDK中的Arrays#sort的方法就是用的策略模式sort(T[] a, Comparator<? super T> c)可以对a集合使用自定义的排序规则,只要实现了Comparator接口的实现类就是一种策略。
