详解:模板设计模式

模板设计模式(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. 数据库操作:在数据库操作中,可以使用模板模式来定义一些通用的步骤。

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

相关推荐
黑客学长-刘备1 分钟前
终于有人把网络安全就业方向一口气讲清了(非常详细)零基础入门到精通,收藏这一篇就够了
java·运维·服务器·网络·python·安全·web安全
小爬虫程序猿2 分钟前
Java爬虫:在1688上“照片快递”上传图片
java·开发语言·爬虫
Json_181790144803 分钟前
小红书笔记详情API接口系列(概述到示例案例)
开发语言·python
热爱生活热爱你24 分钟前
Qt5 读写共享内存,已验证,支持汉字的正确写入和读取
开发语言·qt
J老熊34 分钟前
Nginx 的讲解和案例示范
linux·运维·后端·nginx·面试
帅次36 分钟前
基于云平台的智能家居管理系统设计与通信协议分析
设计模式·重构·软件工程·软件构建·需求分析·代码规范·设计规范
Loong_DQX1 小时前
【flask】 前后端通信方式 原生js的ajax,总结
后端·python·flask
QEasyCloud20221 小时前
简道云和企业微信数据同步集成案例
java·大数据·前端
TheoBrien1 小时前
JUC(java.util.concurrent) 的常⻅类
java·开发语言
淡淡蛋痛1 小时前
D3.js 入门指南
开发语言·javascript·信息可视化