设计模式之模板模式

2023-09-14 00:10:06

豆浆制作问题

编写制作豆浆的程序,说明如下:

  1. 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
  2. 通过添加不同的配料,可以制作出不同口味的豆浆
  3. 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
  4. 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式)

模板方法模式基本介绍

  1. 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  2. 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
  3. 这种类型的设计模式属于行为型模式。

模板方法模式原理类图

在这里插入图片描述

对原理类图的说明-即(模板方法模式的角色及职责)

  1. AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operationr2,3,4
  2. ConcreteClass 实现抽象方法 operationr2,3,4, 以完成算法中特点子类的步骤

模板方法模式解决豆浆制作问题

  1. 应用实例要求
    编写制作豆浆的程序,说明如下:
    制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
    通过添加不同的配料,可以制作出不同口味的豆浆
    选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)
  2. 思路分析和图解(类图)

在这里插入图片描述

  1. 代码展示

https://gitee.com/luan_hao/design-pattern/tree/master/src/main/java/com/lh/template

模板方法模式的钩子方法

  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。

  2. 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

  3. 代码展示:

https://gitee.com/luan_hao/design-pattern/tree/master/src/main/java/com/lh/template/improve

模板方法模式的注意事项和细节

  1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
  2. 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  3. 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  4. 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  5. 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
  6. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
更多推荐

【python百炼成魔】python之字典详解

前言今天我们一起来探讨python的另外一种类型:字典,如果你没有看过列表和元组,建议先学习列表和元组。【python百炼成魔】python之元组详解【python百炼成魔】python之列表详解文章目录前言字典的概念语法格式及字典的创建字典的日常操作1.获取字典的值2.获取字典视图的三个方法3.增加元素,修改元素,删

基于Java在线教学质量评价系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

典型数据结构-栈/队列/链表、哈希查找、二叉树(BT)、线索二叉树、二叉排序树(BST树)、平衡二叉树(AVL树)、红黑树(RB树)

目录典型数据结构列举栈/队列/链表树二叉树线索二叉树二叉排序树平衡二叉树(AVL树)红黑树其它树种和应用介绍典型数据结构列举栈/队列/链表描述略。一些基本的简单实现参考/数据结构简单实现/文件夹里面。线性表详解:数据结构线性表10分钟入门(biancheng.net)。栈(Stack)和队列(Queue)详解(bian

EMQX Enterprise 5.2 发布:Flow 设计器,Amazon Kinesis,Azure Event Hubs

EMQXEnterprise5.2.0版本现已正式发布!新版本带来了一系列重磅更新,最令人瞩目的是可拖拽的可视化Flow设计器,它可以帮助企业快速创建、测试和部署数据集成。同时,我们新增了对AmazonKinesis和AzureEventHubs的支持,实现了海量物联网设备数据与云服务的无缝连接。此外,新版本还进行了多

【数据结构】堆的创建

💐🌸🌷🍀🌹🌻🌺🍁🍃🍂🌿🍄🍝🍛🍤📃个人主页:阿然成长日记👈点击可跳转📆个人专栏:🔹数据结构与算法🔹C语言进阶🚩不能则学,不知则问,耻于问人,决无长进🍭🍯🍎🍏🍊🍋🍒🍇🍉🍓🍑🍈🍌🍐🍍文章目录一、基于大堆的上下调整1.向上调整(1)解决措施:(2)代码实现

【小知识送书2】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

⭐简单说两句⭐作者:后端小知识CSDN个人主页:后端小知识🔎GZH:后端小知识🎉欢迎关注🔎点赞👍收藏⭐️留言📝简单说两句🎁本次送书1~3本取决于阅读量,阅读量越多,送的越多😎欢迎大家在评论区留言,随机挑选幸运观众额,选中的幸运观众将会通过私信告知截止时间:2023-09-23引言在大数据时代,如何有效地挖

认识非托管动态链接库

一、非托管动态链接库1、非托管动态链接库(UnmanagedDynamicLinkLibrary,简称DLL)是一种包含可执行代码和数据的二进制文件,它被设计为在操作系统级别上执行。与托管代码不同,非托管DLL是使用原生机器代码编写的,并且不依赖于特定的运行时环境(如.NETFramework或.NETCore)。非托

字符串函数

目录一、求字符串长度strlen用法:注意:二、长度不受限制的字符串函数strcpy用法:注意:strcat用法:注意:用例:strcmp用法:三、长度受限制的字符串函数介绍strncpy用法:注意:用例:strnact用法:用例:strncmp用法:字符串查找strstr用法:用例:strtok用法:注意:用例:一、

并发的Clock服务

网络编程是并发大显身手的一个领域,由于服务器是最典型的需要同时处理很多连接的程序,这些连接一般来自于彼此独立的客户端。在本小节中,我们会讲解go语言的net包,这个包提供编写一个网络客户端或者服务器程序的基本组件,无论两者间通信是使用TCP、UDP或者Unixdomainsockets。在第一章中我们使用过的net/h

前端工程化小记

1.引言工作中,我们是否经常遇到以下情况:接手其他同事的代码非常痛苦,比如:缩进,换行等等代码风格这些一度让人浑身难受某个同事经常提语法报错的代码,语法报错只能用肉眼一个个review代码,完全没有提示同事每个人写的commit风格都不一样,也有偷懒的,一个单词搞定的,但是也不描述本次更改是属于什么范畴?比如:是加功能

前端JavaScript中MutationObserver:监测DOM变化的强大工具

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言1.MutationObserver简介2.MutationObserver的属性3.MutationObserver的应用场景3.1动态内容加载3.2表单验证3.响应式布局3.4自定义组件开发4.使用Mu

热文推荐