设计模式——模板方法

news/2024/5/18 13:16:42

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

示例

制作豆浆中,制作的步骤都是一样的,因此,使用一个SoyaMilk作为模板类,在该类中将步骤都一一写好,使用的时候子类直接继承这些制作步骤即可。
在这里插入图片描述

模板类

package com.Template;//这个模板类中定义了制作豆浆的抽象方法
public abstract class SoyaMilk {final void make(){select();if(customerWantsCondiments()) {addCondiments();}soak();beat();}void select() {System.out.println("第一步:选择好的新鲜黄豆");}//添加不同的配料,子类具体实现abstract void addCondiments();void soak() {System.out.println("第三步:黄豆和配料开始浸泡,需要3个小时");}void beat() {System.out.println("第四步:黄豆和配料放到豆浆机去打碎");}//钩子方法 决定是否需要加入配料 默认需要加入配料boolean customerWantsCondiments(){return true;}}

子类继承模板类,并重写方法

package com.Template;public class PeanutSoyaMilk extends SoyaMilk{@Overridevoid addCondiments() {System.out.println("加入上好的花生");}
}
package com.Template;public class RedBeanSoyaMilk extends SoyaMilk{@Overridevoid addCondiments() {System.out.println("加入上好的红豆");}
}
package com.Template;public class PureSoyaMilk extends SoyaMilk{@Overridevoid addCondiments() {//空实现}@Overrideboolean customerWantsCondiments() {return false;}
}
package com.Template;public class Client {public static void main(String[] args) {System.out.println("制作红豆豆浆");RedBeanSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();redBeanSoyaMilk.make();System.out.println("制作花生豆浆");PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();peanutSoyaMilk.make();System.out.println("制作纯豆浆");PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();pureSoyaMilk.make();}
}

http://www.mrgr.cn/p/01056500

相关文章

首发!Llama3纯本地部署攻略!中文方法!

引言 llama3在4月19日刚刚发布,官方的对比结果中在开源模型中堪称世界第一,整好周六日有时间,在魔搭社区上测试一下 一、启动环境 登录魔搭社区,到自己的机器资源,可以看到,可选的机器配置, …

信息收集-cnblog

信息收集 domain:"kuaishou.com" AND port:"80" 360网络空间检索语句(domain="qianxin.com")&&ip.port="80" 鹰图曾记得某位大佬说过“渗透测试的本质就是信息收集”,那么信息收集,我们到底该收集啥?信息收集是…

马蜂窝景点评论(以恭王府为例)

1. python部分 马蜂窝.py # -*- coding:utf-8 -*-# @Time : 2024/04/15 18:34 # @Author : 快乐的小猴子 # @Version : # @Function : import subprocess from functools import partial subprocess.Popen = partial(subprocess.Popen, encoding=utf-8) import execjs import r…

DRF之视图组件

【四】视图组件图源:drf(详细)_51CTO博客_什么是drf【1】两个视图基类 【1.1】APIView请在【View】中查看详细【1.2】GenericAPIView 【1.2.1】常用类属性基本设置:以下属性控制着基本视图的行为。queryset用于从视图返回对象的查询结果集。 通常,你必须设置此属性或者重写 g…

Spring Cloud Gateway详细介绍以及实现动态路由

一. 简介 Spring Cloud Gateway This project provides a libraries for building an API Gateway on top of Spring WebFlux or Spring WebMVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to …

JavaBean知识

“感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友。您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!🚀✨”JavaBean 使用前端HTML代码和Java 代码分离,业务逻辑单独封装,然后在JSP页面中调用,就降…

JavaBean-cnblog

JavaBean 使用前端HTML代码和Java 代码分离,业务逻辑单独封装,然后在JSP页面中调用,就降低了耦合度,让JSP更简介,更易维护复用,这样的类就是一个JavaBean组件类JavaBean分为可视化组件和非可视化组件两种,可视化组件可以是简单的GUI元素,如按钮 文本框可以是报表组件,非可视化没…

ctf知识积累

(1)url解码:python解码函数:from urllib.parse import unquote(quote:编码)url_code=""url_code1=unquote(url_code)print(url_code1)Edge 浏览器URL解码:开发人员工具输入:decodeURIComponent(‘’)(2)Unicode解码:from urllib.parse import unquote_plu…

机器人实验室CNRS-AIST JRL, IRL介绍

一、背景 作为搞机器人方向的学生,必须时常关注国际上顶尖实验室的研究成果,以免自己做的方向out,除了大家耳熟能详的Boston Dynamics,还有许多非常厉害的机器人实验室值得我们关注,如日本的CNRS-AIST JRL, IRL实验室…

数据结构PT1——线性表/链表

1:顺序存储实现(数组实现) Data: a1 a2 .....ai ai1 .... an .... typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个 struct LNode{ //结构体成员ElementT…

初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺中考高分!-009

PDF格式公众号回复关键字:ZKYDT009原文1 How did the lot look at the beginning of the story? 解析 1 How 怎么样 did ,the lot 场地, look 看起来,at the beginning of the story?在故事的开头 故事开始时,那个场地看起来怎么样? 2 This place looks like a dump. 这…

30 天精通 RxJS (28):Scheduler 基本观念

不晓得读者们还记不记得,我们在前面的文章中有提到 Scheduler 是为了解决 RxJS 衍生的最后一个问题,而我们现在就在揭晓这个谜底。本系列仅作为学习记录所用,摘录自30 天精通 Rxjs!强烈推荐!膜拜大佬!

sublime text的json快捷键

系统 macos 配置 sublime Text->Settings->Key Bindings 效果 可以看到,按:shiftcommandp,会出现快捷键窗口,打pretty,会出现Format JSON,最右侧显示⌘J,说明只需要macos的⌘和J同时按…

2024红明谷杯——Misc 加密的流量

2024红明谷杯——Misc 加密的流量 写在前面: 这里是贝塔贝塔,照例来一段闲聊 打比赛但赛前一波三折,又是成功签到的一个比赛 说起来比赛全名叫红明谷卫星应用数据安全场景赛,但好像真的跟卫星的关系不大,没有bin方…

顺序表和链表的练习题

顺序表 题目一:题目分析: 该题目需要先对顺序表进行遍历至元素x正确插入位置,再对顺序表完成插入操作。因此涉及到for循环与if语句的使用 代码实现 /******************************************************************** * * name : SequenceList_insert * function : …

JZ8 二叉树的下一个结点

#include <cstddef> class Solution { public:vector<TreeLinkNode*> nodes; //用户得到的输入只有一个 子树根节点TreeLinkNode* GetNext(TreeLinkNode* pNode) {TreeLinkNode* root = pNode;//获取根节点while(root->next )root = root->next;//中序遍历用…

没闲着系列 20

现已将dashboard页面加入了需求的图表和点击panel. 如下图:且现在这个图表是根据迭代出现的,及哪个迭代中出现了多少个需求的story(包括变更、新增、删减、确认), 之后要做的就是将breakdown story和issues连起来,当然在story需求中也可以直接更改状态到完成,而无需创建issues.…

C++:多态

目录 概念&#xff1a; 多态产生的条件&#xff1a; 虚函数的重写&#xff1a; 虚函数&#xff1a;即被virtual修饰的类成员函数称为虚函数 虚函数重写的两个例外&#xff1a; 协变(基类与派生类虚函数返回值类型不同) 析构函数 而为什么没有调用到子类呢&#xff1f; …

查找链表中倒数第k(k为正整数)个位置上的结点,查找成功输出该结点的data值,并返回1,否则只返回0

/******************************************************** name : FindKNode* function : 查找链表中倒数第k(k为正整数)个位置上的结点* 查找成功输出该结点的data值,并返回1,否则只返回0* argument* @head : 链表头结点的地址*…

杂货铺 | KVM虚拟化环境的配置 初步实现两种Guest OS虚拟机的部署

文章目录 &#x1f4da;在ubuntu系统的虚拟机上挂载CentOS操作系统的客户机&#x1f407;下载镜像并配置虚拟机&#x1f407;开启虚拟机&#xff0c;检查CPU是否支持虚拟化&#x1f407;查看是否加载KVM模块&#x1f407;关闭selinux&#x1f407;安装KVM相关软件包&#x1f40…