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

1、先唠唠嗑!

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

Spring框架用到的设计模式很是地多,好比Resource模块运用了策略模式事务模块运用了模板方法模式等等不少,我说不完,你们能够自行谷哥之。算法

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

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

模板模式是一种行为设计模式,它的实现思路是,建立一个模板方法method,在该模板类中定义一些基本方法供模板方法method调用,这些基本方法一般是protected修饰的,由于它并不须要对外提供访问。模板方法method定义了一个算法的执行步骤,或者说可以提供一种默认的实现,这种实现归纳一部分子类或者所有子类的共同部分(说白了就是归纳了全部子类的共同特性,而且本身实现了它)。设计模式

说到设计模式,不贴张UML图出来我都以为很差意思。bash

看到上面的UML图,哈哈,不慌,很是地简单!如今理清下思路,一个最基本的模板方法模式中,你须要建立一个抽象类和一个具体的实现类,从上图能够看到在抽象类中持有一个模板方法和一些基本方法,而子类只须要对这些基本方法进行实现便可,子类并不须要对模板方法进行实现,由于抽象类已经实现好了!并发

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

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

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

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

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

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();//调用模板方法
    }
}
复制代码

3、模板方法设计模式的特色

  • 一、模板方法不能被子类重写,可用final修饰
  • 二、一个模板方法有肯定的步骤组成,这些步骤能够被不一样的子类实现,也能够本身实现

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

  • 一、对于一个业务方法步骤固定,但这些步骤能够有不一样的实现状况下
  • 二、Spring JdbcTemplate、Spring Transaction中用到了
相关文章
相关标签/搜索