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

《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录:

 

CaffeineBeverage
package Chapter8_TemplateMethodPattern;/*** @Author 竹心* @Date 2023/8/17**/public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();//这里使用钩子customerWantsCondiments()来让子类在算法过程中介入if(customerWantsCondiments()){addCondiments();}}abstract void brew();//冲泡abstract void addCondiments();//添加配料void boilWater(){//如果不想子类更改这些方法的实现,可以使用finalSystem.out.println("Boiling Water!");}void pourInCup(){System.out.println("Pouring into cup");}//添加挂钩boolean customerWantsCondiments(){return true;}
}
Coffee
package Chapter8_TemplateMethodPattern;/*** @Author 竹心* @Date 2023/8/17**/public class Coffee extends CaffeineBeverage{public void brew() {System.out.println("Dripping Coffee through filter!");}public void addCondiments(){System.out.println("Adding Sugar and Milk!");}public boolean customerWantsCondiments(){//这里实行相关代码决定客户是否需要添加配料return true;}
}
Tea
package Chapter8_TemplateMethodPattern;/*** @Author 竹心* @Date 2023/8/17**/public class Tea extends CaffeineBeverage{public void brew(){System.out.println("Steeping the tea!");}public void addCondiments(){System.out.println("Adding Lemon!");}public boolean customerWantsCondiments(){//这里实行相关代码决定客户是否需要添加配料return true;}
}
notes
模板方法模式案例:咖啡和茶这两种饮料的制作方法如下:1.把水煮沸2.把咖啡粉末(茶叶)加入水中3.把咖啡(茶)倒进杯子4.添加配料(柠檬、糖、奶等)其中只有第2、4步是有所不同的(但也仅仅是涉及的对象不同),所以将四个步骤抽取出来作为父类CaffeineBeverage中的方法,然后在父类中实现1、3两个步骤,而2、4则由其子类(Tea, Coffee)来实现模板方法:定义一个算法步骤,允许子类提供一个或者多个步骤的实现。优点:
1.提高代码复用
2.可以在不改变算法结构的情况下,重新定义算法中的某些步骤,可维护性好(用案例来说,就是如果要添加新的饮料,可以直接继承该父类,实现其独特的原料配方即可)好莱坞原则:高层组件主动决定控制底层组件,但是底层组件绝对不能调用高层组件。模板方法模式(还有工厂模式、观察者模式)采用了这一原则模板方法模式的应用:常用的Arrays.sort()方法就涉及到模板方法模式,sort()可以对所有的对象数组进行排序,前提是该数组的对象类型实行了接口Comparable下的compareTo()方法。这里的sort()就是模板方法中的模板(遵循了模板方法模式的原则)。

相关文章:

《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录: CaffeineBeverage package Chapter8_TemplateMethodPattern;/*** Author 竹心* Date 2023/8/17**/public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();//这里使用钩子customerWantsCondiments()来…...

RESTful API,以及如何使用它构建 web 应用程序

RESTful API是一种基于HTTP协议的API设计风格,它的核心思想是将资源作为 API 的核心,使用 HTTP 的 GET、POST、PUT、DELETE 等方法对这些资源进行操作,并通过 URL 来定位资源。 RESTful API的特点包括: 资源是 API 的核心使用 H…...

Git+Gitee使用分享

GitGitee快速入门 创建仓库 ​ ​ ​ 初始化本地仓库 验证本地git是否安装好 打开cmd窗口,输入git ​ 这样就OK。 Git 全局设置:(只需要设置一次) 这台电脑如果是第一次使用git,就需要这样初始化一下,这样才知道是谁提交到仓库了。 git confi…...

【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…...

DiscuzQ 二开教程(7)——二次开发版本部署文档

DiscuzQ 二开教程(7)——二次开发版本部署文档 源码:Discuz-Q-V3: 本仓库为Discuz-Q V3.0.211111 版本的二次开发版本,是将DiscuzQ官方仓库进行合并代码(All in One)整理后的仓库,使用更方便。…...

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复?数据丢失是一种让人非常头疼的问题,尤其是当我们的U盘数据丢失了,但内存仍然被占用时,更令人困惑和焦虑。然而,不要慌张!在本文中,将为大家介绍一些有效的方法来恢…...

springboot日志文件名称为什么叫logback-spring.xml

如题,为什么springboot日志配置文件叫logback-spring.xml? 在整个项目中搜索 logback-spring.xml 并没有搜索到。 先看一下 org.springframework.boot.context.logging.LoggingApplicationListener#initialize protected void initialize(ConfigurableEn…...

Mysql 开窗函数(窗口函数)

文章目录 全部数据示例1(说明)开窗函数可以比groupby多查出条件列外的字段,开窗函数主要是为了跟聚合函数一起使用,达到分组统计效果,并且开窗函数的结果集基本都是跟总行数一样示例2示例3示例4错误示例1错误示例2错误…...

计算机视觉之图像特征提取

图像特征提取是计算机视觉中的重要任务,它有助于识别、分类、检测和跟踪对象。以下是一些常用的图像特征提取算法及其简介: 颜色直方图(Color Histogram): 简介:颜色直方图表示图像中各种颜色的分布情况。通…...

【面试经典150题】移除元素·JavaScript版

题目来源 大致思路:遍历数组,如果遇到值为val的元素,使用数组最后一个元素替换它。详细过程: /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let i0,nnums.leng…...

Cesium 相机的三种放置方式

文章目录 Cesium 相机的三种放置方式第一种:setView 计算视角1. Cartesian3 方式2. Rectangle 方式 第二种:flyTo第三种:lookAt Cesium 相机的三种放置方式 Cesium 提供了三种方式对相机的位置进行摆放 第一种:setView 计算视角 …...

看了我这篇帖子,你还会觉得制作电子杂志很难吗?

如果你也像我一样笨手笨脚的不会设计排版制作杂志也没关系,用FLBOOK就能在线制作电子杂志,效果极好! 工具:FLBOOK 步骤如下: 1.打开FLBOOK在线制作电子杂志平台 2.点击开始创作,有四个创建作品的方式&…...

SRE 与开发的自动化协同 -- 生产环境出现 bug 自动生成异常追踪

简介 生产环境 bug 的定义:RUM 应用和 APM 应用的 error_stack 信息被捕捉后成为 bug。 以 APM 新增错误巡检为例,当出现新错误时,在观测云控制台的「事件」模块下生成新的事件报告,捕捉为 bug。同时利用 Dataflux Func 创建异常…...

【简单认识Docker基本管理】

文章目录 一、Docker概述1、定义2.容器化流行的原因3.Docker和虚拟机的区别4.Docker核心概念 二、安装docker三、镜像管理1.搜索镜像2.下载(拉取)镜像3.查看已下载镜像4.查看镜像详细信息5.修改镜像标签6.删除镜像7.导出镜像文件和拉取本地镜像文件8.上传…...

设备管理系统是什么?的修设备管理系统有什么功能?

随着计算机技术的迅速发展和移动互联网的商业化和社会化应用,设备的种类和数量急剧增加。如何利用先进的网络技术和快速更新的计算机设备来有效地收集和处理设备信息,建立以信息化为核心的管理体系,减轻管理和业务人员的数据处理负担&#xf…...

Docker安装并配置Pushgateway

Linux下安装Docker请参考:Linux安装Docker 简介 Pushgateway是Prometheus的一个组件,prometheus server默认是通过Exporter主动获取数据(默认采取pull拉取数据),Pushgateway则是通过exporter主动方式推送数据到Pushg…...

汽车OTA活动高质量发展的“常”与“新”

伴随着车主的频繁崔更,车企除了卷硬件、拼价格,逐渐将精力转移到汽车全生命周期的常用常新。时至下半年,车企OTA圈愈发热闹,以新势力、新实力为代表新一代车企,OTA运营活动逐渐进入高质量发展期。 所谓高质量&#xf…...

C++信息学奥赛1121:计算矩阵边缘元素之和

题解&#xff1a;i0 or j0 or in-1 or jm-1 or in-1 or jm-1 代码&#xff1a; #include<iostream> // 包含输入输出流库 #include<cmath> // 包含数学函数库 using namespace std; // 使用标准命名空间int main() {int n,m;cin>>n>>m; // 输入…...

Android Selector 的使用

什么是 Selector&#xff1f; Selector 和 Shape 相似&#xff0c;是Drawable资源的一种&#xff0c;可以根据不同的状态&#xff0c;设置不同的图片效果&#xff0c;关键节点 < selector > &#xff0c;例如&#xff1a;我们只需要将Button的 background 属性设置为该dr…...

k8s集群中service的域名解析、pod的域名解析

前言 在k8s集群中&#xff0c;service和pod都可以通过域名的形式进行相互通信&#xff0c;换句话说&#xff0c;在k8s集群内&#xff0c;通过service和pod的域名&#xff0c;可以直接访问内部应用&#xff0c;不必在通过service ip地址进行通信&#xff0c;一般的&#xff0c;…...

基于VitePress构建开源AI智能体框架深度中文文档站实战指南

1. 项目概述&#xff1a;一个为AI智能体框架量身打造的中文文档站如果你正在寻找一个能帮你把Claude、GPT这些大模型快速接入到微信、Telegram、飞书等聊天软件的开源框架&#xff0c;那你大概率会接触到OpenClaw&#xff08;原名ClawdBot&#xff09;。但当你兴冲冲地打开官方…...

GitLab实战指南:从零到一的团队协作与项目管理

1. GitLab入门&#xff1a;从注册到组织搭建 第一次接触GitLab时&#xff0c;很多人会被它丰富的功能搞得晕头转向。作为一个长期使用GitLab管理技术团队的老鸟&#xff0c;我想分享一套真正实用的入门方法。GitLab本质上是一个集代码托管、项目管理、CI/CD于一体的DevOps平台&…...

快速排序:核心知识点全解析

一、快速排序 核心所有知识点1. 核心思想分治 挖坑 / 左右双指针 基准值 pivot选一个基准值 pivot把数组划分成&#xff1a;左边 ≤ pivot&#xff0c;右边 ≥ pivot递归对左、右子区间重复划分区间长度为 1 时终止&#xff0c;整体有序2. 时间复杂度平均&#xff1a;\(O(n\l…...

终极指南:SpringAll安全框架实战——Shiro与Spring Security权限控制最佳实践

终极指南&#xff1a;SpringAll安全框架实战——Shiro与Spring Security权限控制最佳实践 【免费下载链接】SpringAll 循序渐进&#xff0c;学习Spring Boot、Spring Boot & Shiro、Spring Batch、Spring Cloud、Spring Cloud Alibaba、Spring Security & Spring Secur…...

为什么你需要LRCGET:5步为离线音乐库实现完美歌词同步

为什么你需要LRCGET&#xff1a;5步为离线音乐库实现完美歌词同步 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 还在为数千首离线音乐缺少歌词而烦恼…...

如何快速构建Python量化分析系统:5步掌握通达信数据接口

如何快速构建Python量化分析系统&#xff1a;5步掌握通达信数据接口 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx MOOTDX是一个基于Python的高效通达信数据接口封装&#xff0c;专为量化投资和数…...

告别英文界面:RedHat 6.3 桌面环境汉化原理与手动配置详解

从底层机制到实战&#xff1a;RedHat 6.3 桌面环境深度汉化指南 第一次在终端里看到满屏英文报错时&#xff0c;我盯着那个"Permission denied"愣了半天——明明昨天刚装好的系统&#xff0c;怎么连个中文提示都没有&#xff1f;这种经历恐怕是很多国内Linux用户的共…...

三步彻底解决Zotero中文文献管理的三大难题:茉莉花插件完整指南

三步彻底解决Zotero中文文献管理的三大难题&#xff1a;茉莉花插件完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 你是否…...

Armv8-A原子操作指令解析与应用优化

1. A64原子操作指令概述在Armv8-A架构中&#xff0c;A64指令集提供了一组强大的原子操作指令&#xff0c;这些指令在多核处理器环境下对实现线程安全的并发操作至关重要。原子操作的核心特性是保证特定内存操作的不可分割性——即这些操作要么完全执行&#xff0c;要么完全不执…...

MCA Selector终极指南:Minecraft世界区块管理的核心技术解析与实战应用

MCA Selector终极指南&#xff1a;Minecraft世界区块管理的核心技术解析与实战应用 【免费下载链接】mcaselector A tool to select chunks from Minecraft worlds for deletion or export. 项目地址: https://gitcode.com/gh_mirrors/mc/mcaselector MCA Selector是一款…...