我们在工作中会遇到由于业务类型太多,通过在代码中使用if/else或者swich的方式,区分不同类型,处理不同的业务逻辑,代码中充斥这大量的判断,导致可阅读性很差,而且新增一个业务类型,又要追加一次判断,一堆判断逻辑、业务逻辑,进一步使代码变得更加臃肿,不利于后续的代码维护,今天给大家介绍几种策略模式如何写。
业务模式:我们就用互联网中常见的WMS仓库系统举例,WMS系统重要就是库存管理,库存数据来源入库又分为很多中,例如:上架入库、备货上架入库、备货下架入库、报损上架入库、报损下架入库以及移库等类型,每一种对库存的操作都需要根据类型进行分别处理,他们有相同的地方,也有不同的地方,相同之处是都是都库存那几张表尽心操作,加减库存数量以及操作记录,往细看,他们有不同之处,不同的地方是他们对库存的总库存、可用库存、锁定库存等字段等操作又不同。
1、一般的策略模式写法:
接口 StockHandle
public interface StockHandle {
void operatorStock(WmsOperateStockParam stockParam);
default void cancelStock(WmsOperateStockParam stockParam){}
}
实现类就是各个入库类型,我们只写一种类型数据最源头的入库上架
public class WmsInboundStockHandle implements StockHandle {
@Resource
private WmsStockOperateService wmsStockOperateService;
@Override
public void operatorStock(WmsOperateStockParam stockParam) {
wmsStockOperateService.operateInboundStock(stockParam);
}
}
上下文Context类
public class Context {
StockHandle handle;
public void operateStock(){
handle.operateStock();
}
public void setStrategy(StockHandle handle) {
this.handle = handle;
}
}
调用的时候
public class Client {
public static void main(String[] args) throws Exception {
Context context = new Context();
context.setStrategy(new WmsInboundStockHandle());
context.operateStock();
}
}
总结:这样简单的策略模式有几个问题
1、当我给其他服务只提供一个入口,例如上面的定义一个stockMain方法,所有类型的操作库存都调用这一个方法,我们只能该方法中增加判断
2、如果给其他服务提供不同的几个入库(提供入库数小于实现类数)时,每个入口又需要写重复的代码
解决方法:
1、针对第一个问题,我们可以增加一个工厂类以及通过在实现类注册成bean以后将该bean保存在工厂类的map中,每次根据入库类型通过工厂类获取对应的实例。
2、针对第二个问题,我们可以通过注解的方式,在bean实例化完成后将其保存到map中,我们通过注解的方式替换上下文类Context类,不管存在多少个入口,调用方只需要按照普通bean调用流程即可
预言:
下一篇文章来介绍如何通过注解的方式实现上述的业务