模板模式
注:文章中的超链接才是重点
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
针对模板模式 我做了些修改 灵感来源于 并发编程中的 线程池 Executor
业务场景介绍
有一个执行业务流程,一批数据需要按照一定的流程进行完毕,针对不同的分支,和不同的实现,我们采用顶层接口,中间抽象类,底层具体实现的原则。
暴露出去的只有中间抽象的模板方法即可。
顶层接口:
IOrderHandler
package com.monco.skeleton; import com.monco.entity.Order; /** * @author monco * @data 2020/8/8 17:58 * @description : 订单业务处理接口 */ public interface IOrderHandler { /** * 创建订单 * * @param order 订单实体 */ void createOrder(Order order); /** * 修改订单 * * @param order 订单实体 */ void updateOrder(Order order); }
抽象类继承:
AbstractOrderHandler
package com.monco.skeleton; import com.monco.entity.Order; /** * @author monco * @data 2020/8/8 18:01 * @description : 定义订单处理统一方法 */ public abstract class AbstractOrderHandler implements IOrderHandler { /** * 实现公共的 订单创建 * * @param order 订单实体 */ @Override public void createOrder(Order order) { System.out.println("创建的订单号为:" + order.getOrderNo() + "创建的订单名称为:" + order.getOrderName()); } /** * 处理订单流程 * * @param order 订单实体 */ public final void handler(Order order) { createOrder(order); updateOrder(order); } }
不同子类实现:
AutoOrderHandler
package com.monco.skeleton; import com.monco.entity.Order; /** * @author monco * @data 2020/8/8 18:04 * @description : 订单自动处理 */ public class AutoOrderHandler extends AbstractOrderHandler { @Override public void updateOrder(Order order) { System.out.println("自动修改订单信息"); } }
ManualOrderHandler
package com.monco.skeleton; import com.monco.entity.Order; /** * @author monco * @data 2020/8/8 18:05 * @description : 订单手动处理 */ public class ManualOrderHandler extends AbstractOrderHandler { @Override public void updateOrder(Order order) { System.out.println("手动修改订单信息"); } }
测试:
package com.monco.skeleton; import com.monco.entity.Order; /** * @author monco * @data 2020/8/8 18:08 * @description : 骨架测试 */ public class SkeletonTest { public static void main(String[] args) { Order order = new Order("1","第一个订单"); AbstractOrderHandler abstractOrderHandler = new ManualOrderHandler(); abstractOrderHandler.handler(order); AbstractOrderHandler handler = new AutoOrderHandler(); handler.handler(order); } }
运行结果:
我们可以针对流程问题进行分别处理,使用骨架和模板方法结合,可以使代码简介明了。
原创不易,求各位大佬多多提点。