详解:模板设计模式

模板设计模式(Template Pattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。

一、定义与特点

定义:

  • 模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

特点:

  • 定义算法骨架:在抽象类中定义一个算法的框架,即算法的骨架。
  • 具体步骤延迟到子类:将一些步骤的具体实现延迟到子类中,使得子类可以灵活地重新定义这些步骤。

二、结构与角色

抽象类(AbstractClass):

  • 实现了模板方法,定义了算法的骨架。
  • 包含了一些具体方法(有默认实现)和抽象方法(由子类实现)。

具体类(ConcreteClass):

  • 实现抽象类中的抽象方法,完成完整的算法。

三、举例

以下是一个关于咖啡和茶制备过程的例子,用于说明模板设计模式的应用:

1.创建一个抽象类Template,写了一个模版方法prepare,因为咖啡和茶制备过程:准备开水和倒进杯子这两个步骤都有并且一样所以直接提取出来放到模版中,因为煮的方法和添加的方法不同所以修饰为抽象类,要求子类继承重写实现。

复制代码
public abstract class Template {
    // 准备饮料
    public void prepare() {
        // 准备开水
        System.out.println("准备开水");
        // 煮
        brew();
        // 倒进杯子
        System.out.println("倒进杯子");
        // 添加调味品
        addCondiments();
    }
    //抽象方法
    public abstract void brew();
    public abstract void addCondiments();
}

子类Coffee继承父类Template并重写父类的抽象方法

复制代码
class Coffee extends Template {
    @Override
   public void brew() {
        System.out.println("煮咖啡");
    }

    @Override
   public  void addCondiments() {
        System.out.println("加糖和牛奶");
    }
}

子类Tea继承父类Template并重写父类的抽象方法

复制代码
class Tea extends Template {
    @Override
    public void brew() {
        System.out.println("泡茶");
    }

    @Override
    public void addCondiments() {
        System.out.println("加柠檬");
    }
}

最后编写测试类,创建子类对象分别调用父类的模版方法prepare

复制代码
 class Test {
    public static void main(String[] args) {
        Template coffee = new Coffee();
        coffee.prepare();
        System.out.println("=====================");
        Template tea = new Tea();
        tea.prepare();
    }
}

抽象类Template也可以这样写(将子类中公共的代码块进行封装并在prepare方法中调用):

复制代码
public abstract class Template {
    // 准备饮料
   public void prepare() {
        // 准备开水
        boilWater();
        // 煮
        brew();
        // 倒进杯子
        pourInCup();
        // 添加调味品
        addCondiments();
    }

    public abstract void brew();
    public abstract void addCondiments();

    public void boilWater() {
        System.out.println("准备开水");
    }

    public void pourInCup() {
        System.out.println("倒进杯子");
    }
}

四、模板设计步骤:

1.创建一个抽象类作为父类并创建一个模版方法,将子类中公共的代码块进行封装并在模版方法中调用

2.将子类特有的代码块封装成抽象的方法并在模版方法中调用

3.子类分别重写父类的抽象方法

4.在测试类中分别创建子类对象再调用父类的模版方法

示意图:

五、应用场景

  1. 算法框架固定,但具体步骤可能有变化:当多个类有相似的行为,但其中一些细节不同时,可以使用模板设计模式。
  2. 代码复用:通过将共同的行为放在一个抽象类的模板方法中,可以避免代码的重复。
  3. 框架设计:在框架设计中,模板模式经常用于定义框架的骨架和流程。
  4. 生命周期管理:在对象的生命周期管理中,模板模式可以确保某些过程按照一定的顺序执行。
  5. GUI应用中的事件处理:模板模式可以用于定义事件处理的框架。
  6. 数据库操作:在数据库操作中,可以使用模板模式来定义一些通用的步骤。

综上所述,模板设计模式是一种非常有用的设计模式,它可以帮助我们提高代码的可维护性和可复用性。通过定义一个算法的骨架,并将某些步骤推迟到子类中实现,我们可以在不改变算法结构的情况下,灵活地重新定义算法中的某些步骤。

相关推荐
weixin_419658318 分钟前
CANoe 使用指南:从输出窗口到数据回放的完整实战教程
开发语言·功能测试·车载系统·自动化·汽车
当青春邂逅吉米多维奇9 分钟前
C#图解教程(第5版) 同步方法
开发语言·c#
骇客野人17 分钟前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质20 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
波力海苔夹心脆67525 分钟前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
m0_5873830025 分钟前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
栖凤31 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
小师兄吃牛肉32 分钟前
Java 同步系列之 ZooKeeper 分布式锁
java·分布式·java-zookeeper
Thneonl40 分钟前
全集群钟差 300 毫秒会发生什么:证书悄悄过期,日志倒流
运维·后端
金銀銅鐵40 分钟前
[Java] 借助GUI展示class文件的版本号
后端·python·ai编程