行为模式1.模板方法模式

 行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

模板方法模式(Template Method Pattern) 是一种行为型设计模式,它定义了一个操作中的算法骨架,允许子类在不改变算法结构的情况下重定义该算法的某些步骤。通过这个模式,可以将不变的部分放在父类中,而将可变的部分留给子类去实现。模板方法模式通常涉及两个主要部分:抽象类具体子类

主要角色
  1. 抽象类(Abstract Class)

    • 定义了算法的骨架,即模板方法。
    • 其中包含一个或多个抽象方法,这些方法将在子类中实现。
    • 还可以包含一些具体方法(即已实现的方法)。
  2. 具体类(Concrete Class)

    • 子类继承抽象类并实现其中的抽象方法,以完成算法中变动的部分。
模板方法模式的工作流程
  • 父类定义一个“模板方法”,这个方法通常是一个完整的算法步骤,并且在其中调用了一些抽象方法和具体方法。
  • 子类重写这些抽象方法来实现自己特定的行为,而算法的整体结构和流程由父类来控制。

模板方法模式的优点

  • 代码复用:父类实现的固定步骤可以在多个子类中复用,减少了代码的重复性。
  • 易于扩展:通过继承父类并实现不同的步骤,子类可以非常容易地进行功能扩展。
  • 控制反转:父类控制着算法的流程,子类只需要关注具体的步骤,符合“控制反转”的设计思想。

模板方法模式的缺点

  • 类的数量增多:由于模板方法模式需要抽象类和多个具体类,有时会导致类的数量增多,增加维护成本。
  • 过度继承:如果父类设计不当,可能会导致不必要的继承关系,增加类的复杂性。

示例:制作饮料的过程

假设我们有一个饮料的制作过程。不同的饮料(比如咖啡和茶)有不同的步骤,但它们都有一些共同的步骤,比如煮水、倒入杯子等。使用模板方法模式,可以将共同的步骤放在父类中,而将不同的步骤(如制作咖啡或茶的方式)留给子类去实现。

// 饮料准备的抽象类
public abstract class Beverage {// 模板方法,定义了制作饮料的过程public final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 共同步骤:煮水private void boilWater() {System.out.println("Boiling water");}// 共同步骤:倒入杯子private void pourInCup() {System.out.println("Pouring into cup");}// 抽象方法,子类需要实现的步骤:冲泡饮料protected abstract void brew();// 抽象方法,子类需要实现的步骤:添加调料protected abstract void addCondiments();
}// 具体子类:咖啡
public class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Brewing coffee");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk");}
}// 具体子类:茶
public class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping the tea");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon");}
}public class TemplateMethodDemo {public static void main(String[] args) {// 创建咖啡和茶的实例Beverage coffee = new Coffee();Beverage tea = new Tea();System.out.println("Making coffee:");coffee.prepareRecipe();  // 输出咖啡制作过程System.out.println("\nMaking tea:");tea.prepareRecipe();  // 输出茶制作过程}
}

代码解析

  1. 抽象类 Beverage

    • 定义了一个 prepareRecipe() 方法,这是整个算法的模板方法,它规定了制作饮料的流程。
    • boilWater() 和 pourInCup() 是固定步骤,已经在父类中实现。
    • brew() 和 addCondiments() 是抽象方法,留给子类去实现,具体取决于饮料的种类。
  2. 具体类 CoffeeTea

    • Coffee 和 Tea 类分别实现了 brew() 和 addCondiments() 方法,定义了具体的制作步骤。
  3. 客户端代码 TemplateMethodDemo

    • 在客户端中,分别创建了 Coffee 和 Tea 的实例,调用 prepareRecipe() 方法来制作咖啡和茶。
    • 无论是制作咖啡还是制作茶,共同的步骤(如煮水、倒入杯子)都是由父类 Beverage 中的实现完成的,而每种饮料的具体制作方法由各自的子类来完成。

模板方法模式的应用场景

  1. 多个子类有相同的算法,但某些步骤不同的场景:比如不同的饮料、餐饮、制作流程等。
  2. 框架设计:许多框架(如Spring框架)会提供一个模板方法,允许用户自定义具体的步骤。
  3. 工作流管理:在复杂的工作流中,可以定义一些固定步骤和可变步骤,使用模板方法来管理整个工作流的执行。

总结

模板方法模式通过定义一个固定的算法骨架,并将一些具体步骤延迟到子类中实现,提供了代码复用的同时也保留了灵活的扩展性。它能够让不同的子类在不修改父类的情况下,提供不同的行为实现。

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

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

相关文章

PHP语言的计算机基础

计算机基础与PHP语言入门 在当今信息技术高速发展的时代,计算机已经成为我们日常生活中不可或缺的重要工具。学习计算机基础知识,不仅能增强我们对信息技术的理解,还会为我们后续学习编程语言打下良好的基础。本文将以PHP语言为切入点&#…

docker中使用Dockerfile设置Volume挂载点

关于在docker中如何使用Volume,可以参考文章: docker中使用Volume完成数据共享-CSDN博客 如果想在生成docker镜像的时候设置好挂载点,而不是在运行镜像生成容器时生成。 下面以自建一个tomcat镜像为例,演示如何在生成镜像时设置…

在Mac电脑上搭建Gradle

1. 检查是否已安装Homebrew 打开终端,输入以下命令检查Homebrew是否已安装: brew -v如果显示版本号,则表示已安装。如果未安装,请运行以下命令安装Homebrew: /bin/bash -c "$(curl -fsSL https://raw.githubus…

springboot548二手物品交易boot代码(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统二手物品交易信息管理难度大,容错率低&#x…

仿生的群体智能算法总结之三(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发,深入分析了实现类似OpenAI o1模型性能的路线图,聚焦于策略初始化、奖…

AF3 AtomAttentionEncoder类的init_pair_repr方法解读

AlphaFold3 的 AtomAttentionEncoder 类中,init_pair_repr 方法方法负责为原子之间的关系计算成对表示(pair representation),这是原子转变器(atom transformer)模型的关键组成部分,直接影响对蛋白质/分子相互作用的建模。 init_pair_repr源代码: def init_pair_repr(…

DS复习提纲模版

数组的插入删除 int SeqList::list_insert(int i, int item) { //插入if (i < 1 || i > size 1 || size > maxsize) {return 0; // Invalid index or list is full}for (int j size-1; j > i-1; j--) { // Shift elements to the rightlist[j1] list[j];}li…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…

C# _ 数字分隔符的使用

总目录 一、数字分隔符是什么&#xff1f; _ 用作数字分隔符。可以将数字分隔符用于所有类型&#xff08;二进制&#xff0c;十进制&#xff0c;十六进制&#xff09;的数字文本。数字分隔符 _ 在编译时是被编译器忽略的&#xff0c;因此在语义上对数字结果没有任何影响。 二…

工程师了解的Lua语言

1、关于lua语言 lua语言是用于嵌入式领域当中的一门脚本语言&#xff0c;其实在大学期间&#xff0c;我也没有接触过这门语言&#xff0c;但是在未来的发展之路当中&#xff0c;需要用到这门语言&#xff0c;所以在我的知识库当中添加这门语言知识是必要而且重要的&#xff0c;…

Mac iTerm2集成DeepSeek AI

1. 去deepseek官网申请api key&#xff0c;DeepSeek 2. 安装iTerm2 AI Plugin插件&#xff0c;https://iterm2.com/ai-plugin.html&#xff0c;插件解压后直接放到和iTerms相同的位置&#xff0c;默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…

1.2.1 归并排序

归并排序原理 1&#xff09; 整体就是一个简单递归&#xff0c; 左边排好序、 右边排好序、 让其整体有序 2&#xff09; 让其整体有序的过程里用了外排序方法 3&#xff09; 利用master公式来求解时间复杂度 4&#xff09; 归并排序的实质 时间复杂度O(N*logN)&#xff0c;额…

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

内部类 --- (寄生的哲学)

内部类总共有 4 种&#xff08;静态内部类、非静态内部类、局部内部类、匿名内部类&#xff09; 作用&#xff1a; 一&#xff1a;内部类提供了更好的封装&#xff0c;可以把内部类隐藏在外部类之内&#xff0c;不允许同一个包中的其他类访问该类。 二&#xff1a;内部类可以…

电脑里msvcr120.dll文件丢失怎样修复?

电脑里msvcr120.dll文件丢失的修复指南 在电脑的日常使用中&#xff0c;我们可能会遇到各种各样的系统文件丢失问题&#xff0c;其中msvcr120.dll文件的丢失就是较为常见的一种。作为一名在软件开发领域深耕多年的从业者&#xff0c;我将为大家详细解析msvcr120.dll文件的重要…

今日头条ip属地根据什么显示?不准确怎么办

在今日头条这样的社交媒体平台上&#xff0c;用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而&#xff0c;不少用户发现自己的IP属地显示与实际位置不符&#xff0c;这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据&#xff0c;并提供解决IP属…

理解linux内核中的几种地址

1. 前言 《Linux内核完全注释》这本书提到了几种Linux内核中的几种地址&#xff0c;实地址&#xff0c;有虚拟地址&#xff0c;逻辑地址&#xff0c;线性地址&#xff0c;物理地址。除了物理地址以外&#xff0c;其他几种容易弄混淆。这里做一下笔记&#xff0c;讲一下我的理解…

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;trait的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#x…

Java List 集合详解:基础用法、常见实现类与高频面试题解析

正文 在 Java 集合框架中&#xff0c;List 是一个非常重要的接口&#xff0c;广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展&#xff0c;同时通过实际代码示例帮助你快速掌握这些知识。 &#x1f449;点击获取2024Java学习资料 1…