谈一谈我对‘模板方法’设计模式的理解(Template)

一、先唠唠嗑!

之所以想写这个模板方法设计模式,我想纯属偶然!为什么呢?因为最近在看关于Spring框架的源代码,刚开始看有点晕,因为你会被它所有类、接口的继承关系所迷乱,不过当你知道了它是运用哪种设计模式,那么我想说再去看源代码至少轮廓就清晰很多了!

Spring框架用到的设计模式非常地多,比如Resource模块运用了策略模式事务模块运用了模板方法模式等等很多,我说不完,大家可以自行谷哥之。

接下来我就解释下什么是模板方法模式,至于它在Spring中的应用,我打算之后再写出一篇文章来进行总结!

二、什么是模板方法设计模式?

模板模式是一种行为设计模式,它的实现思路是,创建一个模板方法method,在该模板类中定义一些基本方法供模板方法method调用,这些基本方法通常是protected修饰的,因为它并不需要对外提供访问。模板方法method定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分(说白了就是概括了所有子类的共同特性,并且自己实现了它)。

说到设计模式,不贴张UML图出来我都觉得不好意思。

《谈一谈我对‘模板方法’设计模式的理解(Template)》

看到上面的UML图,哈哈,不慌,非常地简单!现在理清下思路,一个最基本的模板方法模式中,你需要创建一个抽象类和一个具体的实现类,从上图可以看到在抽象类中持有一个模板方法和一些基本方法,而子类只需要对这些基本方法进行实现即可,子类并不需要对模板方法进行实现,因为抽象类已经实现好了!

wokao,賊抽象有木有!下面我就引用一个例子对其进行说明:引用自并发编程网

假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户

    1. Fundation
    1. Pillars
    1. Walls
    1. Windows。

最重要的一点就是不能改变此建造过程(也就是我们不能修改或者重写模板方法的意思),比如不可能在没用地基的时候就开始建造窗户吧!如果可以,那简直是胡扯!。这个例子中,我们就创建了一个模板方法 – 将使用不同的方法完成对房子的建造。

为了确保子类不能重写(override)这个模板方法,应当使用final。

HouseTemple.java(这个对应我们上面UML图中的AbstractClass)

package com.journaldev.design.template;
//抽象类
public abstract class HouseTemplate {

    //这是我们的模板方法,子类不能重写
    public final void buildHouse(){
        buildFoundation();//第一步:建造地基
        buildPillars();//第二步,建造支撑
        buildWalls();//第三步,建造墙
        buildWindows();//第四步,建造窗户
        System.out.println("House is built.");
    }

    //这个步骤可以默认实现,原文是private修饰,那么就是说我规定死啦,这个步骤只能这样实现了,但为了易扩展,还是protected OK点
    protected void buildWindows() {
        System.out.println("Building Glass Windows");
    }
    
    //被子类实现的方法
    protected abstract void buildWalls();
    protected abstract void buildPillars();
    
    protected void buildFoundation() {
        System.out.println("Building foundation with cement,iron rods and sand");
    }
}
复制代码

下面就写下具体的实现类:

WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Wooden Walls");
    }
    
    @Override
    public void buildPillars() {
        System.out.println("Building Pillars with Wood coating");
    }
}
复制代码

GlassHouse.java

package com.journaldev.design.template;</code>

public class GlassHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Glass Walls");
    }

    @Override
    public void buildPillars() {
        System.out.println("Building Pillars with glass coating");
    }
}
复制代码

使用模板方法:

package com.journaldev.design.template;

public class HousingClient {

    public static void main(String[] args) {
        //创建一个模板,子类由WoodenHouse实现
        HouseTemplate houseType = new WoodenHouse();

        houseType.buildHouse();//调用模板方法
        System.out.println("************");
        //创建一个模板,子类由GlassHouse实现
        houseType = new GlassHouse();
        houseType.buildHouse();//调用模板方法
    }
}
复制代码

三、模板方法设计模式的特点

  • 1、模板方法不能被子类重写,可用final修饰
  • 2、一个模板方法有确定的步骤组成,这些步骤可以被不同的子类实现,也可以自己实现

四、模板方法设计模式应用场景

  • 1、对于一个业务方法步骤固定,但这些步骤可以有不同的实现情况下
  • 2、Spring JdbcTemplate、Spring Transaction中用到了
    原文作者:算法小白
    原文地址: https://juejin.im/post/5ab1c805518825556918dbe9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞