Head First Design Patterns -模板方法模式

什么是模板方法模式

在一个方法中定义一个算法的骨架,而把一些步骤延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
这些算法步骤中的一个或者多个被定义为抽象的,由子类实现。

类图

在这里插入图片描述

代码

书中用泡茶和泡咖啡作为例子,比较了他们的共同点与不同点,从而做抽象。

泡咖啡的步骤:

  1. 把水煮沸
  2. 用沸水冲泡咖啡
  3. 把咖啡倒进杯子
  4. 加糖和奶

泡茶的步骤:

  1. 把水煮沸
  2. 用沸水浸泡茶叶
  3. 把茶倒进杯子
  4. 加柠檬

从上面可以看出,泡咖啡和泡茶的基本流程是一样的,而且其中把水煮沸的动作也是一样的

由上面的分析可以抽象出,代码如下

顶层抽象类的设计

public abstract class Beverage {final void prepareRecipe() { //冲泡方法,定义为final,防止子类更改顺序boilWater();brew();pourInCup();if (customerWantsCondiments()) {  //用钩子方法来做条件判断addCondiments();}}abstract void brew();abstract void addCondiments();void boilWater() {System.out.println("Boiling water");}void pourInCup() {System.out.println("pouring into cup");}boolean customerWantsConditions() {  // 钩子函数return true; //默认是添加的,子类可以覆盖这个方法}
}

Tea

public class Tea extends Beverage {@Overridevoid brew() {System.out.println("Steeping the tea");}@Overridevoid addCondiments() {System.out.println("Adding Lemon");}
}

Coffee

public class Cofffee extends Beverage {@Overridevoid brew() {System.out.println("Coffee filter");}@Overridevoid addCondiments() {System.out.println("adding sugar and milk");}
}

应用

java API中很多地方会用到模板方法的思想,但使用形式不是完全跟书上类似

下面是一个Arrays.sort()的使用

鸭子类

public class Duck implements Comparable<Duck>{private String name;private int weight;public Duck(String name, int weight) {this.name = name;this.weight = weight;}@Overridepublic String toString() {return name + " " + weight;}@Overridepublic int compareTo(Duck other) {return Integer.compare(this.weight, other.weight);}

对鸭子进行排序

public class DuckStoreTest {public static void main(String[] args) {Duck[] ducks = {new Duck("a", 5),new Duck("b", 9),new Duck("c", 3)};System.out.println("Before sort");display(ducks);Arrays.sort(ducks); System.out.println("After sort");Arrays.sort(ducks);display(ducks);}public static void display(Duck[] ducks) {for (Duck d : ducks) {System.out.println(d);}}
}

Arrays.sort()是一个静态方法,这里用户类Duck实现了Comparable的方法,但是并不是通过继承父类的方式类实现。

设计原则

好莱坞原则:不要打电话给我们,我们会打电话给你们。强调了是高层组件去调用低层组件,低层子组件会参与计算,但是不直接调用高层组件。

优点

模板方法定义了算法的步骤,然后把这些步骤的实现延迟到了子类

提供了一种代码复用的重要技巧

工厂方法是模板方法的一个特例

策略模式和模板方法模式都是封装算法,但是前者是通过组合,而后者是通过继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 编程语言中访问修饰符(access modifiers)

C#访问修饰符 protected 访问修饰符&#xff1a;1. public 访问修饰符&#xff1a;2. private 访问修饰符&#xff1a;3. internal 访问修饰符&#xff1a;4. protected internal 访问修饰符&#xff1a; 在 C# 编程语言中&#xff0c;有多个访问修饰符&#xff08;access modi…

kotlin中使用myibatis-plus的lambdaQuery的问题

kotlin中使用myibatis-plus的lambdaQuery的问题 代码&#xff1a;lambdaQuery().eq(User::username, username).one()报错&#xff1a;org.apache.ibatis.reflection.ReflectionException: Error parsing property name register$lambda$0. Didnt start with is, get or set.解…

#Linux(Samba安装)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;键入命令安装Samba sudo apt-get install samba &#xff08;2&#xff09;修改samba配置文件 //打开配置文件 sudo vi /etc/samba/smb.…

Java基础-常用类

文章目录 1.Math类2.System类1.exit代码 结果2.arraycopy参数解释代码结果 3.currentTimeMillens代码结果 3.大数处理方案基本介绍BigInteger类介绍代码结果 BigDecimal类介绍代码结果 4.日期类对于IDEA类图中的属性![image-20240101190844530](https://img-blog.csdnimg.cn/im…

HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转

HJ10 字符个数统计 字符个数统计_牛客题霸_牛客网 题目分析 这个问题可以通过维护一个字符出现频率的数组来解决。考虑到 ASCII 码的范围是 0~127&#xff0c;我们可以创建一个长度为 128 的布尔数组&#xff08;或者使用位操作优化空间&#xff09;&#xff0c;用来标记某个…

深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?

深度学习在OCR领域的应用已经取得了瞩目的成果&#xff0c;而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中&#xff0c;CRNN和Attention OCR犹如两颗璀璨的明珠&#xff0c;备受瞩目。 CRNN&#xff0c;这位结合了卷积神经网络&#xff08;CNN&#xff09;和…

电子电器架构 —— 诊断数据DTC具体故障类型篇

电子电器架构 —— 诊断数据DTC具体故障类型篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝…

Spark Stage

Spark Stage 什么是Stage Spark中的一个Stage只不过是物理执行计划其中的一个步骤&#xff0c;它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task&#xff0c;每组任务被称为一个Stage&#xff0c;可以简单理解为MapReduce里面的Map Stage&#xff0c; Reduce Stag…

Unity 中 苹果眼镜开发入口

1. 文档介绍了Unity对Apple新操作系统visionOS的支持。 2. Unity提供了完善的文档、模板和支持,帮助开发者快速为visionOS开发应用。 3. Unity的跨平台框架AR Foundation和XR Interaction Toolkit可以帮助现有移动和XR应用无缝迁移到visionOS。 4. 在visionOS上,可以利用Uni…

kafka(三)——librdkafka编译与使用(c++)

linux下编译 源码下载 git clone https://github.com/edenhill/librdkafka配置、编译和安装 # 进入目录 cd librdkafka/# 配置 ./configure# 编译 make# 安装 make install头文件和库目录 # 头文件 /usr/local/include/librdkafka rdkafkacpp.h rdkafka.h rdkafka_mock.h #…

LLM漫谈(五)| 从q star视角解密OpenAI 2027年实现AGI计划

最近&#xff0c;网上疯传OpenAI2027年关于AGI的计划。在本文&#xff0c;我们将针对部分细节以第一人称进行分享。​ 摘要&#xff1a;OpenAI于2022年8月开始训练一个125万亿参数的多模态模型。第一个阶段是Arrakis&#xff0c;也叫Q*&#xff0c;该模型于2023年12月完成训练&…

vue3+threejs新手从零开发卡牌游戏(十一):添加简单的手牌上场逻辑

首先优化之前的战域相关代码&#xff0c;主要是将战域分成两部分&#xff0c;上方是对方战域&#xff0c;下方是己方战域&#xff0c;然后修改了战域中格子的名称&#xff0c;方便后续不同手牌上场的逻辑区分&#xff1a; game/site/index.vue完整代码如下&#xff1a; <!…

【WEEK4】 【DAY4】AJAX第一部分【中文版】

【WEEK4】 【DAY4】AJAX第一部分【中文版】 2024.3.21 Thursday 目录 8.AJAX8.1.简介8.2.伪造ajax8.2.1.新建module&#xff1a;springmvc-06-ajax8.2.2.添加web支持&#xff0c;导入pom依赖8.2.2.1.修改web.xml8.2.2.2.新建jsp文件夹 8.2.3.新建applicationContext.xml8.2.4.…

快速入门Kotlin②控制流函数

控制流 if if是一个表达式&#xff0c;可以用于条件判断和控制流。 fun main() {// 传统用法val a 1val b 2var max aif (a < b) max b// With elsevar max2: Intif (a > b) {max2 a} else {max2 b}// 作为表达式val max3 if (a > b) a else b } when whe…

蓝桥杯刷题_day2

文章目录 DAY2杨辉三角查找整数数列特征字母图形(未通过全部样例) DAY2 杨辉三角 【题目描述】 杨辉三角形又称Pascal三角形&#xff0c;它的第i1行是(ab)i的展开式的系数。它的一个重要性质是&#xff1a;三角形中的每个数字等于它两肩上的数字相加。 下面给出了杨辉三角形的…

2024智能短信营销推广系统使用攻略

智能短信营销推广系统以其精准、高效的特点&#xff0c;成为企业与消费者建立联系的重要桥梁。云衔科技凭借其先进的技术和专业的服务&#xff0c;为企业提供了一套完善的智能短信营销推广系统解决方案&#xff0c;让企业在短时间内实现大规模、个性化的短信营销活动。 云衔科…

01---java面试八股文——mybatis-------10题

1、什么是MyBatis Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql&#xff0c…

数据结构与集合(一)

当我们谈论数据结构时&#xff0c;我们实际上在讨论一种组织和管理数据的方式。数据结构是计算机科学中非常重要的一部分&#xff0c;它为我们提供了存储、检索和操作数据的方法。在数据结构中&#xff0c;链表是一种基本且常用的数据结构&#xff0c;它由一系列节点组成&#…

【Word自动化办公】使用python-docx对Word进行操作

目录 一、环境安装 二、文档各组成结构获取 2.1 组成结构讲解 2.2 段落run对象的切分标准 三、获取整篇文档内容 四、写入指定样式的数据 4.1 通过add_paragraph与add_run参数添加样式 4.2 单独设置文本样式 五、添加标题 六、换行符&换页符 七、添加图片数据 …

Go 版本 Etcd 客户端操作 Etcd(附完整 Demo)

Etcd 相关参考资料 Etcd 的介绍与使用&#xff1a;Etcd 介绍与使用&#xff08;入门篇&#xff09;-CSDN博客 Etcd Raft 协议&#xff1a;Etcd Raft 协议&#xff08;进阶篇&#xff09;-CSDN博客 本文诣在使用 Go 客户端操作 Etcd&#xff0c;并实现元数据的写入&#xff0…