模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个
或者多个步骤提供实现。
模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。
模板模式适用于以下场景:
1、一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
以网络销售商品为例,模板流程大体为:
上架商品-下订单-发快递-收货 ,如果需要退货还需进行退货流程。
注:
博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
首先创建NetworkGoods抽象类
- package com.ruoyi.demo.designPattern.templatePattern;
-
- public abstract class NetworkGoods {
-
- protected final void saleGoods(){
- //上架商品
- this.groundGoods();
- //下订单
- this.placeOrder();
- //发快递
- this.express();
- //收货
- this.receipt();
- //是否需要退货
- if(needReturnGoods()){
- doReturnGoods();
- }
- }
-
- //进行退货
- abstract void doReturnGoods();
-
- //是否需要退货
- //钩子方法:实现流程的微调
- protected boolean needReturnGoods(){
- return false;
- }
- //上架商品
- final void groundGoods(){
- System.out.println("上架商品");
- }
-
- //下订单
- final void placeOrder(){
- System.out.println("下订单");
- }
-
- //发快递
- final void express(){
- System.out.println("发快递");
- }
-
- //收货
- final void receipt(){
- System.out.println("收货");
- }
- }
上面代码中有个钩子方法,主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务的需求。
然后创建ComputerGoodsSale
- package com.ruoyi.demo.designPattern.templatePattern;
-
- public class ComputerGoodsSale extends NetworkGoods{
- @Override
- void doReturnGoods() {
- System.out.println("电脑进行退货");
- }
- }
创建BookGoodsSale
- package com.ruoyi.demo.designPattern.templatePattern;
-
- public class BookGoodsSale extends NetworkGoods{
-
- private boolean needReturnGoodsFlag = false;
-
- public BookGoodsSale(boolean needReturnGoodsFlag){
- this.needReturnGoodsFlag = needReturnGoodsFlag;
- }
-
- @Override
- protected boolean needReturnGoods() {
- return this.needReturnGoodsFlag;
- }
-
- @Override
- void doReturnGoods() {
- System.out.println("书籍进行退货");
- }
- }
客户端测试代码
- package com.ruoyi.demo.designPattern.templatePattern;
-
- public class networkGoodsSaleTest {
- public static void main(String[] args) {
- System.out.println("电脑进行网络销售");
- NetworkGoods computerGoods = new ComputerGoodsSale();
- computerGoods.saleGoods();
-
- System.out.println("书籍进行网络销售");
- NetworkGoods bookGoods = new BookGoodsSale(true);
- bookGoods.saleGoods();
- }
- }
创建模板类JdbcTemplate,封装所有的JDBC操作。以查询为例,每次查询的表不同,返回的
数据结构也不一样。针对不同的数据,都要将其封装成不同的实体对象。而每个实体对象的发封装
逻辑是不一样的,但是封装前和封装后的流程是不变的。
优点:
1、利用模板模式将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
3、将不变的行为写在父类中,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。
缺点:
1、每个抽象类都需要一个子类来实现,导致了类的数量增加。
2、类数量的增加间接地增加了系统的复杂性。
3、因为继承关系自身的缺点,如果父类增加新的抽象方法,所有子类都要改一遍。