设计模式: 模板模式

目录

一,模板模式

二,特点

三,组成部分

四,实现步骤

五,案例


一,模板模式

模板模式(Template Pattern)是一种行为型设计模式,它在超类中定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

二,特点

  1. 算法骨架:在超类中定义了算法的骨架,即算法的整体步骤。

  2. 钩子(Hooks):在模板方法中定义的一些方法,它们在超类中不做具体实现,而是在子类中根据需要重写。

  3. 抽象操作:在模板方法中定义的一些抽象方法,它们在子类中必须被实现。

  4. 具体操作:在模板方法中定义的一些具体方法,它们在超类中已经实现,也可以在子类中被覆盖。

  5. 扩展性:模板模式通过在子类中覆盖钩子和抽象操作,可以很容易地扩展新的功能。

三,组成部分

  • AbstractClass:定义了模板方法和一些抽象操作,以及一个或多个钩子方法。
  • ConcreteClass:继承自AbstractClass,实现模板方法中的抽象操作,也可以覆盖钩子方法。

四,实现步骤

  1. 定义一个抽象类AbstractClass,其中包含模板方法和其他一些操作。
  2. AbstractClass中实现模板方法,调用所有必要的操作。
  3. 定义一个或多个具体操作,这些操作在抽象类中是抽象的,需要在子类中实现。
  4. 定义钩子方法,它们在模板方法中被调用,但在抽象类中不做具体实现。
  5. 创建一个或多个继承自AbstractClass的子类,实现抽象操作,并根据需要覆盖钩子方法。

五,案例

java 复制代码
abstract class CafeMaker {
    public final void makeCoffee(){//模板方法 定义了制作咖啡的步骤
        putWaterInMachine();
        putCoffeeBeansInMachine();
        cook();
        pourInCup();
    }
    protected void cook(){//钩子方法
        System.out.println("使用机器烹制");
    }
    protected abstract void putWaterInMachine();//定义抽象方法
    protected abstract void putCoffeeBeansInMachine();//定义抽象方法
    private void pourInCup() {//具体方法
        System.out.println("将咖啡倒入杯子里");
    }
}
class EspressoMaker extends CafeMaker{

    @Override
    protected void putWaterInMachine() {
        System.out.println("加入热水");
    }

    @Override
    protected void putCoffeeBeansInMachine() {
        System.out.println("加入咖啡豆");
    }
}
class Client {
    public static void main(String[] args) {
        CafeMaker maker = new EspressoMaker();
        maker.makeCoffee();
    }
}

在这个例子中,CafeMaker 是一个抽象类,它定义了制作咖啡的算法骨架(模板方法 makeCoffee()),同时定义了两个抽象方法 putWaterInMachine()putCoffeeBeansInMachine(),这些方法由具体子类实现。此外,它还包含一个钩子方法 烹制() 和一个具体方法 pourInCup()

EspressoMakerCafeMaker 的具体实现,它继承自 CafeMaker 并提供了 putWaterInMachine()putCoffeeBeansInMachine() 方法的实现。

客户端代码通过创建 EspressoMaker 的实例,并调用 makeCoffee() 方法来制作咖啡。

这个模板模式的例子展示了如何通过定义算法的骨架和推迟某些步骤到子类中实现,来达到代码复用和扩展性的目的。

相关推荐
wb0430720122 分钟前
性能优化实战:基于方法执行监控与AI调用链分析
java·人工智能·spring boot·语言模型·性能优化
LXS_35728 分钟前
Day 05 C++ 入门 之 指针
开发语言·c++·笔记·学习方法·改行学it
天若有情6731 小时前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
etsuyou2 小时前
js前端this指向规则
开发语言·前端·javascript
lichong9512 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
shizhenshide2 小时前
为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
开发语言·php·验证码·captcha·recaptcha·ezcaptcha
lichong9512 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
@yanyu6662 小时前
Tomcat安装与HTML响应实战
java·tomcat·html
mit6.8242 小时前
[Agent可视化] 配置系统 | 实现AI模型切换 | 热重载机制 | fsnotify库(go)
开发语言·人工智能·golang
友友马2 小时前
『 QT 』QT控件属性全解析 (一)
开发语言·前端·qt