模板模式(Template Pattern)就是在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤。
这个模式好懂哈,就比如一条生产汽车的流水线,其中各个组装操作点都放到子类,整个流水线就是算法(生产汽车)的骨架,在每一个操作点(子类)中都可以在不影响整个算法构架的前提下重新定义该算法(比如安装车门的时候,安装白色车门、拉式车门、滑动式车门都可以)。
最近在写查询域的项目,支持客户查询和车辆查询,他们的操作流程都是分为入参校验、组装中台入参、执行查询、解析结果组装响应参数等步骤。此时就可以使用模板模式来实现。
一、代码实现查询域:
1.建立一个公共的DTO,这个主要用于数据流转packagecom.xing.design.template; /*** 查询DTO* @author xing* @createTime*/publicclassQueryDTO { privateStringcode; privateStringmessage; publicvoidsetCode(Stringcode) { this.code=code; } publicStringgetCode() { returnthis.code; } publicvoidsetMessage(Stringmessage) { this.message=message; } publicStringgetMessage() { returnthis.message; } } 2.建立模板类packagecom.xing.design.template; publicabstractclassQuery { /*** 校验请求参数*/abstractQueryDTOcheck(QueryDTOqueryDTO); /*** 组装请求参数*/abstractQueryDTOmakeReq(QueryDTOqueryDTO); /*** 调用核心接口执行查询*/abstractQueryDTOdoSome(QueryDTOqueryDTO); /*** 组装响应参数*/abstractObjectmakeRes(QueryDTOqueryDTO); /*** 查询操作流程模板*/publicfinalObjectquery(QueryDTOqueryDTO) { check(queryDTO); makeReq(queryDTO); doSome(queryDTO); returnmakeRes(queryDTO); } } 3.车辆查询packagecom.xing.design.template; /*** 车辆查询* @author xing*/publicclassCarQueryextendsQuery{ QueryDTOcheck(QueryDTOqueryDTO) { System.out.println("车辆查询入参校验..."); returnqueryDTO; } QueryDTOmakeReq(QueryDTOqueryDTO) { System.out.println("车辆查询中台入参组装"); returnqueryDTO; } QueryDTOdoSome(QueryDTOqueryDTO) { System.out.println("车辆查询去中台查询,将查询结果转换到"); returnqueryDTO; } ObjectmakeRes(QueryDTOqueryDTO) { System.out.println("对queryDTO进行解析,然后组装车辆的响应DTO"); returnqueryDTO; } } 4.客户查询packagecom.xing.design.template; /*** 客户查询* @author xing*/publicclassCustomerQueryextendsQuery{ QueryDTOcheck(QueryDTOqueryDTO) { System.out.println("客户查询入参校验..."); returnqueryDTO; } QueryDTOmakeReq(QueryDTOqueryDTO) { System.out.println("客户查询中台入参组装"); returnqueryDTO; } QueryDTOdoSome(QueryDTOqueryDTO) { System.out.println("客户查询去中台查询,将查询结果转换到"); returnqueryDTO; } ObjectmakeRes(QueryDTOqueryDTO) { System.out.println("对queryDTO进行解析,然后组装客户的响应DTO"); returnqueryDTO; } } 5.编写main方法调用查询packagecom.xing.design.template; /*** 模板模式* @author xing*/publicclassTemplateDemo { publicstaticvoidmain(String[] args) { System.out.println("---------------------车辆查询流程开始---------------------"); Querycar=newCarQuery(); car.query(newQueryDTO()); System.out.println("---------------------车辆查询流程结束---------------------"); System.out.println("---------------------客户查询流程开始---------------------"); Querycustomer=newCustomerQuery(); customer.query(newQueryDTO()); System.out.println("---------------------客户查询流程结束---------------------"); } }
6.测试结果:
为防止恶意操作,一般模板方法都加上 final 关键词。
总结:
模板模式就是将固定的流程(不变的部分)封装到一个模板类中,然后将流程中具体的操作节点实现放到子类去各实现各的(可变的部分)。父类控制行为,子类实现行为。
END