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

模板方法模式(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.mzph.cn/bicheng/3654.shtml

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

相关文章

富格林:安全落实防备诱导欺诈建议

富格林悉知,作为一项投资活动,炒黄金在近些年来备受欢迎,它交易灵活,投资者采取正规做单操作即可获取不错收益。但大家也要知道,投资存在一定风险,一定要做好防备虚假欺诈操作,避免诱导上当亏损…

单例模式(设计模式)

文章目录 概述懒汉式饿汉式双重加锁机制类级内部类方式单例模式适用场景Spring 的单例实现原理单例被破坏的五个场景单例的实现方式实现线程安全的单例模式 概述 单例模式:单例对象能保证在一个JVM中,该对象只有一个实例存在。保证被创建一次&#xff0…

Kubernetes:云原生时代的核心引擎

文章目录 一、Kubernetes简介:引领云原生潮流二、K8s的核心特性:自动化与智能化三、K8s的实践应用:打造高效云原生应用架构四、K8s的挑战与应对:安全与性能并重五、K8s的未来展望:无限可能与挑战并存《Kubernetes快速进…

【windows-搭建Ubuntu22LTS】

一、环境要求 1. windows版本要求 至少Windows 10 2020年5月(2004) 版, Windows 10 2019年5月(1903) 版,或者 Windows 10 2019年11月(1909) 版 2. 控制面板开启相关的程序(需要重启) 二、Microsoft store安装unbuntu 下载后直接运行(稍微等会&#…

从开发角度理解漏洞成因(01)

文章目录 PHP开发漏洞环境(SQL注入)生成前端代码生成后端代码数据库写功能调试功能 测试SQL注入漏洞字符型注入布尔盲注 PHP开发漏洞环境(SQL注入) 持续更新中… 文章中代码资源已上传资源,如需要打包好的请点击PHPM…

亿道三防onerugged|工业车载电脑在港口正面吊上的应用

港口正面吊是港口作业中至关重要的设备,它承担着装卸集装箱等重要任务。作为专业人员,我深知港口作业的复杂性和挑战性。在这方面,亿道三防onerugged系列的工业车载电脑为港口正面吊的应用提供了一种创新的解决方案。 首先,工业车…

milvus对象存储和消息中间件的工厂设计模式分析

milvus对象存储和消息中间件的工厂设计模式分析 需求 根据参数设置创建mq和storage mq有kafka,pulsar storage有local,minio,remote 配置文件 根据配置文件选择初始化mq和存储: mq:type: pulsarcommon:storageType: minio对于这种类型一个是mq,一个是存储&…

理解与解决BouncyCastle库中“ASN1Primitive overrides final method equals”异常

理解与解决BouncyCastle库中“ASN1Primitive overrides final method equals”异常 引言错误原因分析应用场景及解决方案示例示例一:不同版本间的兼容性问题示例二:库之间的相互影响示例三:JDK版本适配问题 结论 引言 在Java开发中&#xff0…

springboot+vue新疆肉牛智慧牧场养殖系统

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限,普通员工没有。 系统需要包含奶牛的编号,种类,体重,健康情况、生长情况、牛奶产量,以及上次更新数据时间等信息,管理员可以对…

关于权限的设计

首先系统权限,每个账号登录后,都需要知道这个账号允许访问哪些api,哪些数据权限(一般是指其他账号的一些数据) 这里就需要通过角色来关联。 --1.角色绑定菜单,每个菜单设计的时候包含了这个菜单会用到的所…

设计模式:合成复用原则(Composite Reuse Principle,CRP)介绍

合成复用原则(Composite Reuse Principle,CRP)是面向对象设计原则之一,它强调通过组合已有的对象来实现新的功能,而不是通过继承已有的类来实现。合成复用原则的核心思想是尽量使用对象组合而不是类继承,从…

Hive官方文档 join table 总结

Hive官方文档 join table 总结 join_table:table_reference [INNER] JOIN table_factor [join_condition]| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition| table_reference LEFT SEMI JOIN table_reference join_condition| table_referen…

C语言中定义和声明的区别

定义: 编译器在创建一个对象时, 为该对象申请开辟了内存空间, 这个空间的名字就是变量或者对象名, 同一个变量名在某个区域只能定义一次, 重复定义会出现错误 声明有两种作用: 1. 告诉编译器, 这个变量或者函数, 我已经定义了 (开辟了空间了), 但是在别的地方, 我先说明一下…

HarmonyOS 实战开发-使用canvas实现图表系列之折线图

一、功能结构 实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强。然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容。下面简单阐述…

C# 调整图像的亮度简单示例

操作顺序: 首先加载要调整亮度的图像。 然后通过循环遍历图像的像素,并根据需要增加像素的亮度值。 最后,将调整后的图像保存回原始文件。 代码如下: using System; using System.Drawing.Imaging;class Program {static void…

【Linux系统编程】基础指令(二)

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

架构师系列- 定时任务(二)- Quartz框架

quartz特点 Quartz是一个优秀的任务调度框架, 具有以下特点 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;负载均衡高可用 quartz 架构体系 Quartz 设计有四个核心类,分别是Scheduler(调度…

一个简单的java递归下降语法分析器例子

import parser.Parser; import parser.RecursiveDescentParser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arra…

NXP i.MX8系列平台开发讲解 - 3.10 Linux PCIe资源分配与访问(二)

目录 1. PCIe BFD 2. PCIe 配置空间 2.1 PCIe 配置空间访问 PCIe I/O访问方法 PCIe MMIO访问方法 3. PCIe BAR相关 4. PCIe Capbility 5. PCIe 操作 本文将重点讲解PCIe的资源访问相关内容&#xff0c;对于PCIe资源访问是从Host 端老看可以对PCIe进行配置与访问的资源主…

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV&#xff0c;您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速&#xff0c;但需要安装额外的库&#xff0c;如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤&#xff1a; 安装NVIDIA CUDA Toolkit: 首先&#xff0c;您需要安装NVID…