Java23种设计模式-行为型模式之模板方法模式

embedded/2024/11/15 4:30:04/

模板方法模式(Template Method Pattern)在超类定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤

基本组成
Abstract (抽象类):定义了模板方法和一些基本的方法。模板方法是一个定义算法骨架的方法,它调用基本方法来完成算法的各个步骤。
Concrete(具体类):继承自抽象类,实现模板方法中尚未实现的基本方法。
Hook Method(钩子方法):在抽象类中定义,可以被子类重写。钩子方法允许子类在模板方法的执行过程中进行干预。

优点
封装了算法的变化,提高了代码的复用性
子类可以控制算法的某些步骤,而不需要改变算法的结构
缺点
每一个不同的实现都需要一个子类,这可能会导致类的数量增加

应用场景
当需要在一个算法中定义一系列步骤,但某些步骤可以延迟到子类中实现时。
当需要复用代码,但不希望子类依赖于特定的实现时。

示例:Beverage 是抽象类,定义了制作饮料的模板方法和一些基本方法。Tea 和 Coffee 是具体类,它们继承自 Beverage 并重写 brew 方法。客户端通过调用 prepareRecipe 方法来制作不同的饮料。

//抽象类
public abstract class Beverage {//模板方法public final void perpareRecipe(){boilwater();brew();pourInCup();addCoundiments();}//基本方法,可以是抽象的,也可以为具体的protected abstract void brew();protected void addCoundiments(){System.out.println("Adding lemon");}//钩子方法protected void hood(){System.out.println("Doing something before adding condiments");}//其他基本方法private void boilwater(){System.out.println("Boiling water");}private void pourInCup(){System.out.println("Pouring into cup");}
}
//具体类
public class Tea extends Beverage{@Overrideprotected void brew() {System.out.println("Steeping the tea");}public void addCondiments(){super.addCoundiments();System.out.println("Adding tea specific condiments");}
}
//具体类
public class Coffee extends Beverage{@Overrideprotected void brew() {System.out.println("Dripping coffee through filter");}public void addCondiments(){super.addCoundiments();System.out.println("Adding coffee specific condiments");}public void hook(){System.out.println("Doing somenthing coffee specific before adding condiments");}
}
public class Client {public static void main(String[] args) {Beverage tea=new Tea();tea.perpareRecipe();System.out.println("----------------------------");Beverage coffee=new Coffee();coffee.perpareRecipe();}
}

http://www.ppmy.cn/embedded/17269.html

相关文章

python网络爬虫爬取需要的数据

要爬取网站的数据,你可以使用 Python 的 requests 库来发送 HTTP 请求,并使用 BeautifulSoup 库来解析返回的 HTML 内容。但是,在此之前,你需要检查该网站的 robots.txt 文件,以确认是否允许爬虫抓取特定页面的数据。 …

BERT(Bidirectional Encoder Representations from Transformers)

BERT(Bidirectional Encoder Representations from Transformers)在深度学习中指的是一种基于Transformer架构的预训练模型,特别用于自然语言处理(NLP)任务。BERT是由Google的研究团队在2018年提出的,并且迅…

Linux查看僵尸进程

1、查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。 2、定位僵尸进程 使用命令ps -A -ostat,ppid,pid,cmd |grep -e ‘^[Zz]’定位僵尸进程以及该僵尸进程的父进程。 3、杀死僵尸进程 使用Kill -…

Scrapy爬虫框架入门(豆瓣电影Top 250)

文章目录 Scrapy 官网Scrapy 文档GithubScrapy 简介项目结构爬虫实现XPath 教程创建 Scrapy 项目配置用户代理网页 dom 元素 IP 代理池IP代理池作用配置IP代理池申请IP代理池 Scrapy 官网 https://scrapy.org/ Scrapy 文档 https://docs.scrapy.org/en/latest/ Github htt…

大数据分析:使用Spark和Hadoop的实用指南

Apache Spark 和 Apache Hadoop 是两个在大数据生态系统中非常流行的框架。Hadoop 主要用于数据存储和处理大规模数据集的批处理作业,而 Spark 是一个强大的计算框架,提供了更快的计算速度和更高效的数据处理能力。这里提供一个实用指南,帮助…

【剪映专业版】11音频的全流程剪辑操作

视频课程:B站有知公开课【剪映电脑版教程】 1.音乐素材 可能包含人声,音乐素材普遍比较长,几十秒到几分钟。要点击倒三角才会出现分类。 点击下载箭头下载素材;点击加号将素材增加到轨道;时间指示器在哪个地方&#…

Linux及tmux、vim常用命令

Linux 关于Linux的简介、诞生、迭代,大家可以去网上查一查,这里不多做赘述了 Linux文件类型 非常重要的文件类型有: 普通文件,目录文件,链接文件,设备文件,管道文件,Socket 套接字文件 等。 …

Java基础教程(8)-Java中的面向对象和类(二)

面向对象的三大基本特征 封装(Encapsulation)继承(Inheritance)多态(Polymorphism)封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 封装是面向对象的特征之一,是对象和类概念的主要特性。…