设计模式-模板模式

时间:2022-07-25
本文章向大家介绍设计模式-模板模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

当房子建好后,相同的房间规格,但是可以根据不同的需求进行不同的装修,有把天花板刷黄,有些刷绿,有些乱刷...这个很类似于设计模式中的模板模式,根据相同的模板生成出来后内部装修可以自定义。

模板模式是什么?

模板模式(Template Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这种模式属于行为模式。

角色:

抽象的模板(Abstract Template):主要用于定义骨架和方法操作,提供给具体模板继承的一个顶级模板。

具体模板(Concrete Template):具体实现抽象模板的一些方法及实现自己的逻辑和步骤。

模板模式可以干嘛?

模板模式解决的一个问题就是相同的东西,将其抽象出公共的父类,供子类继承并且实现,这个也很好的体现了java的继承特性,并且通过继续后子类可以根据自己的需求进行内部逻辑的实现。

优点:

代码复用率高:通过继承父类,子类可以实现自己的算法而不会影响到整体结构;

缺点:

每个实现都会增加一个子类,会导致系统庞大;

个人理解:

就是类似于盖好房子,相同的房间大小,可以根据不同的风格来做装修,有些装修欧式,有些装修简约。

模板模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/**
 * @ClassName Houser (模板)
 * @Author  csh
 * @Description
 * @Date 2020/6/21
 **/
public abstract class Houser {
    abstract void initialize();
    abstract void wall();
    abstract void floor();

    //模板
    public final void decor(){
        //初始化房子
        initialize();
        //刷墙
        wall();
        //贴地板
        floor();
    }
}
/**
 * @ClassName EuropeanStyle
 * @Author csh
 * @Description 实现(Concrete Template)
 * @Date 2020/6/21
 **/
public class EuropeanStyle extends Houser {
    @Override
    void initialize() {
        System.out.println("准备欧式风格材料完毕!");
    }

    @Override
    void wall() {
        System.out.println("大理石墙面!");
    }

    @Override
    void floor() {
        System.out.println("大理石地板!");
    }
}
/**
 * @ClassName Sinicism
 * @Author csh
 * @Description 实现(Concrete Template)
 * @Date 2020/6/21
 **/
public class Sinicism extends Houser {
    @Override
    void initialize() {
        System.out.println("中国风格基础材料准备完毕!");
    }

    @Override
    void wall() {
        System.out.println("皇宫墙");
    }

    @Override
    void floor() {
        System.out.println("木板房子");
    }
}
/**
 * @ClassName Client
 * @Author csh
 * @Description 模板模式,通过抽象父类子类进行继承然后进行实现。
 * @Date 2020/6/21
 **/
public class Client {
    public static void main(String[] args) {
        Houser chineseStyle = new Sinicism();
        chineseStyle.decor();
        EuropeanStyle europeanStyle = new EuropeanStyle();
        europeanStyle.decor();
    }
}

结果

中国风格基础材料准备完毕!
皇宫墙
木板房子
准备欧式风格材料完毕!
大理石墙面!
大理石地板!

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

模板模式非常简单,并且经常大家都在用,只是不知道而且,像各位老兄看过spring或者其他开源框架用的地方随处都是,主要的思想就是java的继承的实现,通过一个抽象的模板子类来继承并且实现里面的具体算法,通过父类定好的方法,通过子类实现,通过父类定好的方法执行。

常用框架用到:

HttpServlet继承GenericServlet