当前位置: 首页 > news >正文

设计模式: 模板模式

目录

一,模板模式

二,特点

三,组成部分

四,实现步骤

五,案例


一,模板模式

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

二,特点

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

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

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

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

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

三,组成部分

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

四,实现步骤

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

五,案例

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{@Overrideprotected void putWaterInMachine() {System.out.println("加入热水");}@Overrideprotected 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() 方法来制作咖啡。

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

http://www.lryc.cn/news/344391.html

相关文章:

  • [虚拟机+单机]梦幻契约H5修复版_附GM工具
  • 头文件相互包含 前向声明
  • 七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统
  • centos7-bcc 安装
  • 5.06号模拟前端面试8问
  • 解读Inscode AI:开启代码智能化的新时代
  • 快速了解Vuex
  • vue管理系统导航中添加新的iconfont的图标
  • Docker的介绍及与传统虚拟化技术的区别
  • 06.Git远程仓库
  • Anaconda安装和深度学习环境的安装(TensorFlow、Pytorch)
  • 元素设置 flex:1,但是会被内部长单词宽度超出拉伸
  • win11 安装oracle11g详细流程及问题总结
  • 自我模拟面试
  • 头歌java面向对象基础
  • PMP课程知识点很多,无法入手,该如何学习?
  • 隔离流量优化网络传输
  • 【前端热门框架【vue框架】】——事件处理与表单输入绑定以及学习技巧,让学习如此简单
  • 芒果YOLOv8改进164:检测头篇:ImplicitHead 隐性知识检测头| 即插即用,独家新颖更新,精度高效涨点
  • 学习周报:文献阅读+Fluent案例+有限体积法理论学习
  • 用户中心(下)
  • 商务分析方法与工具(六):Python的趣味快捷-字符串巧妙破解密码本、身份证号码、词云图问题
  • ftp方式和http方式搭建云仓库
  • vue2 + antvx6 实现流程图功能
  • IDEA 中的奇技淫巧
  • LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)
  • CMakeLists.txt语法规则:部分常用命令说明三
  • android init进程启动流程
  • 利用爬虫解决数据采集难题
  • 智慧粮库/粮仓视频监管系统:AI视频智能监测保障储粮安全