Spring小技巧之设计模式
Spring小技巧之设计模式责任链模式模式定义示例代码策略模式模式模式定义示例代码责任链模式模式定义该模式在《图解设计模式》的第14章节《Chain of Responsibility模式》有详细的介绍。简单来说当一个对象需要交给多个处理类依次处理的时候就可以用责任链模式Servlet Filter、Spring 拦截器链都是这一模式的实际应用在订单履约等业务场景中也经常使用到。示例代码OrderCreatedBaseHandler责任链顶层接口定义类所有处理器都实现该接口。packagecom.wwq.test;/** * 创建订单责任链接口 */publicinterfaceOrderCreatedBaseHandler{/** * 运行消息处理 */voidrun(Orderorder);/** * 是否执行/br * 子类重写该方法可根据配置开关来确定是否执行 run 方法 */defaultbooleanisRun(Orderorder){returntrue;}}OrderCreatedOperate责任链执行器类是整个责任链的管理容器和启动入口。利用Spring批量注入接口实现类为List的机制串联整个链条。packagecom.wwq.test;/** * 责任链执行器运行所有 OrderCreatedBaseHandler 实现类 */ComponentpublicclassOrderCreatedOperate{/* * 注入全部处理器 */AutowiredprivateListOrderCreatedBaseHandlerbaseOrderCreatedHandles;/** * 运行消息处理 * param orderCreatedMessage 订单创建消息 */publicvoidrun(Orderorder){for(OrderCreatedBaseHandlerhandler:baseOrderCreatedHandles){if(handler.isRun(order)){handler.run(order);}}}}各个责任链处理可通过Order注解调整他们的执行顺序。packagecom.wwq.test;/** * 创建订单处理器 */Slf4jComponentpublicclassOrderCreatedHandlerimplementsOrderCreatedBaseHandler{publicvoidrun(OrderCreatedMessageorderCreatedMessage){// TODO 创建订单}}packagecom.wwq.test;/** * 积分处理器 */Slf4jComponentpublicclassPointHandlerimplementsOrderCreatedBaseHandler{publicvoidrun(OrderCreatedMessageorderCreatedMessage){// TODO 积分抵扣和发送}}packagecom.wwq.test;/** * 物流处理器 */Slf4jComponentpublicclassLogisticsHandlerimplementsOrderCreatedBaseHandler{publicvoidrun(OrderCreatedMessageorderCreatedMessage){// TODO 处理物流流程信息}}packagecom.wwq.test;/** * 商品库存处理器 */Slf4jComponentpublicclassStockHandlerimplementsOrderCreatedBaseHandler{publicvoidrun(OrderCreatedMessageorderCreatedMessage){// TODO 库存扣减}}如果想各个处理器并行执行可以使用 CompletableFuture.runAsync() 提交异步任务。packagecom.wwq.test;/** * 责任链执行器运行所有 OrderCreatedBaseHandler 实现类 */ComponentpublicclassOrderCreatedOperate{/* * 责任链执行线程池 */AutowiredQualifier(orderCreatedTaskExecutor)privateExecutororderCreatedTaskExecutor;/* * 注入全部处理器 */AutowiredprivateListOrderCreatedBaseHandlerbaseOrderCreatedHandles;/** * 运行消息处理 * param orderCreatedMessage 订单创建消息 */publicvoidrun(Orderorder){/* * 收集 Future */ListCompletableFuture?futuresnewArrayList();/* * 异步执行每个处理器 */for(OrderCreatedBaseHandlerhandler:baseOrderCreatedHandles){futures.add(CompletableFuture.runAsync(()-{if(handler.isRun(order)){handler.run(order);}},orderCreatedTaskExecutor));}/* * 等待所有异步任务全部执行完毕 */CompletableFuture.allOf(futures.toArray(newCompletableFuture[0])).join();}}策略模式模式模式定义该模式在《图解设计模式》的第10章节《Strategy模式》有详细的介绍。当需要根据某种条件整体替换运算逻辑时就可以使用策略模式在支付渠道、文件解析、报表导出、优惠计算等场景都有应用。示例代码策略接口定义publicinterfacePayStrategy{// 渠道标识StringgetChannel();// 支付逻辑voidpay(BigDecimalamount);}策略实现ComponentpublicclassAliPayStrategyimplementsPayStrategy{OverridepublicStringgetChannel(){returnALI;}Overridepublicvoidpay(BigDecimalamount){System.out.println(支付宝支付amount);}}ComponentpublicclassWxPayStrategyimplementsPayStrategy{OverridepublicStringgetChannel(){returnWX;}Overridepublicvoidpay(BigDecimalamount){System.out.println(微信支付amount);}}策略工厂ServicepublicclassPayStrategyFactory{// 自动注入全部策略实现privatefinalMapString,PayStrategystrategyMap;AutowiredpublicPayStrategyFactory(ListPayStrategypayStrategies){this.strategyMapnewHashMap();for(PayStrategystrategy:payStrategies){strategyMap.put(strategy.getChannel(),strategy);}}// 根据渠道获取对应策略publicPayStrategygetStrategy(Integerchannel){returnstrategyMap.get(channel);}}使用策略AutowiredprivatePayStrategyFactoryfactory;publicvoidtest(){PayStrategyalifactory.getStrategy(ALI);ali.pay(newBigDecimal(100));}