Java设计模式之行为型-模板方法模式(UML类图+案例分析)

news2024/12/29 9:37:24

目录

一、概念

二、角色设计

三、代码实现

案例一

案例二

四、总结


一、概念

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类当中,使得子类可以不改变该算法结构的情况下重定义该算法的特定步骤,即在一个抽象类中公开定义了执行某一方法的模板,然后子类可以按需重写方法实现自己特有的逻辑。

通俗的来讲其实就好比做一道菜一样,同样的步骤每个人做出来的味道缺大相径庭,这个步骤就可以理解为模板方法模式,采用固定的步骤去做,但是如何去实现就看自己怎么想了。

二、角色设计

角色描述
AbstractClass(基类)抽象类,在基类中定义或声明了一系列基本操作,这些操作可以是具体或者是者抽象的,每一个操作都对应算法的一个步骤,这些步骤在其派生类中都可以重定义。基类规定了算法的流程框架,模板方法由基类定义或声明的一系列基本操作按照一定流程实现。
BraisedFish(派生类)实现在基类中声明的抽象方法,也可以覆盖在基类中已经实现的方法。

三、代码实现

案例一

假设做一盘菜固定有3个步骤,分别是热锅、烹饪和出锅,因为步骤是固定的,只有烹饪手法不同,只需要重写cooking方法即可。

1、定义一个抽象模板类

注:为了防止恶意的操作,一般模板方法前面会加上final关键字,不允许被覆写。

public abstract class AbstractClass {

    final void operation(){
        this.start();
        this.cooking();
        this.end();
    }

    private void start(){
        System.out.println("热锅...");
    }

    protected abstract void cooking();

    private void end(){
        System.out.println("出锅...");
    }

}

2、具体模板实现类

public class BraisedFish extends AbstractClass{

    @Override
    protected void cooking() {
        System.out.println("做红烧肉...");
    }

}

3、场景测试类

    public static void main(String[] args) {
        AbstractClass abstractClass = new BraisedFish();
        abstractClass.operation();
    }

4、运行结果

案例二

假设做一杯奶茶有三个固定的步骤,分别是选材、加料和打包,这边也同样采用相同的逻辑进行实现。

1、定义制作奶茶的抽象类

public abstract class MakeTeaMilk {

    final void make(){
        select();
        addCondiments();
        pack();
    }

    /**
     * 选果茶/奶茶
     */
    abstract void select();

    /**
     * 添加配料
     */
    abstract void addCondiments();

    /**
     * 打包
     */
    private void pack(){
        System.out.println("奶茶打包!");
    }
}

2、制作一杯果茶

/**
 * 果茶
 * @author HTT
 */
public class FruitTeaMilk extends MakeTeaMilk{

    @Override
    void select() {
        System.out.println("选取柠檬汁");
    }

    @Override
    void addCondiments() {
        System.out.println("添加补丁");
    }
}

3、测试

    public static void main(String[] args) {

        MakeTeaMilk fruitTeaMilk = new FruitTeaMilk();
        fruitTeaMilk.make();

    }

 4、运行结果

四、总结

优点:

1、封装不变的部分,拓展可变的部分

2、提取公共代码,便于维护

3、行为由父类控制,由子类实现 

主要用于多个子类共用的方法且逻辑相同的情况下使用。

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

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

相关文章

信驰达科技携手TI将CC2340推向更广市场领域

根据蓝牙技术联盟(Bluetooth SIG)2023年最新发布《2023年蓝牙市场最新资讯》,市调机构ABI Research预测数据显示,蓝牙市场在未来五年将会实现高增长,蓝牙设备年出货量将保持强劲增长势头,预计到2027年将达7…

python高频函数—CSV() 读写

Part.1 csv.reader()函数 csv.reader(csvfile, dialectexcel, **fmtparams) 返回一个 reader 对象,该对象将逐行遍历 csvfile。 一个简短的用法示例: >>> import csv>>> with open(eggs.csv, newline) as csvfile:... spamreader csv.r…

ctrl键的作用

crtl是control的英文缩写,是控制的意思,长和其他键组合起来使用,达到快捷操作的功能。 例如:ctrlX是剪切的功能,ctrlP是打印设置,ctrlZ是撤销,ctrlF是查找,ctrlY是恢复的功能等。 …

在野外使用无线电台的必知事项

电台属于无线通信设备的一种,主要用于发送和接收无线电信号,实现语音、数据和图像等信息的传输。它一般是由发射机和接收机两部分组成,能够在不同的频段和频率上进行通信。通过无线电波传输信息,为人们在不同场景中提供可靠的远距…

11.Rocket解决分布式事务

highlight: arduino-light 两阶段提交协议 原文链接:https://blog.csdn.net/fenglibing/article/details/92417739 两阶段提交协议(Two-phase Commit,2PC)经常被用来实现分布式事务。一般分为协调器TC和若干事务执行者两种角色,这里的事务执行…

【Vue3】学习笔记-ref函数、reactive函数

ref函数、reactive函数 Ref函数reactive函数 Ref函数 作用:定义一个响应式的数据语法:const xxxref(initValue) 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。JS中操作数据:xxx.value模板中读取数据:不需要.va…

地理数据处理-地理空间表的导入与查询

前言 现在大部分数据库都支持地理空间的数据存储,可以方便的与GIS平台调用,比如Geoserver、ArcGis, 但是如果使用不规范的空间表去发布图层预览可能会出现各种问题,比如坐标系错误,无法聚焦。 本文将举例最常见的SQLServer和Post…

Godot引擎 4.0 文档 - 手册 - 2D

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: 2D — Godot Engine (stable) documentation in English 画布层 视口和画布项目 CanvasItem是所有 2D 节点的基础,无论是常规的 2D 节点,例如…

深入理解微分、积分电路!搞懂PID控制原理就这么简单!

很多朋友觉得PID是遥不可及,很神秘,很高大上的一种控制,对其控制原理也很模糊,只知晓概念性的层面,知其然不知其所以然,那么本期从另类视角来探究微分、积分电路的本质,意在帮助理解PID的控制原…

智慧排水监测系统有什么作用?

随着城市化进程的加速,城市排水系统的压力不断增加。然而,当前城市排水系统面临着管理效率低下、水资源浪费和洪涝灾害等问题。为了解决这些问题,智慧排水监测系统逐渐成为了新的解决方案。本文将为大家详细介绍智慧排水监测系统的作用以及智…

微软公布量子超级计算机路线图

光子盒研究院 6月22日,微软公布了三个重要的量子计算公告。首先,公司宣布它已经实现了通往量子超级计算机的六步路线图的第一个里程碑,并发表了一篇经同行评议的研究论文来证明这一成就。 这家科技巨头的第二项公告是将其人工智能&#xff08…

堆——“数据结构与算法”

各位CSDN的uu们你们好呀,今天小雅兰的内容仍旧是二叉树,此刻分享的内容是一种特殊的二叉树,也就是堆了。下面,让我们进入堆的世界吧!!! typedef int HeapDataType; typedef struct Heap {HeapDa…

MES系统是什么?它如何帮助企业提高生产效率?

随着制造业的发展,越来越多的企业开始使用全面的制造执行系统(MES)来管理其生产过程。那么,MES系统到底是什么呢?它又是如何帮助企业提高生产效率的呢?本文将为大家详细介绍。 一、MES系统的概念 MES系统是…

Leetcode 剑指 Offer II 032. 有效的变位词

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断它们是不…

基于物联网技术的智能配电室综合监控系统设计与产品选型

摘要:配电室是电力系统的重要基础设施,可以保障供配电系统的安全稳定运行。但是,配电室数量多、部署分散、管理复杂,人工现场巡检管理方式费时费工、错误率高,如果发生故障隐患,往往无法及时发现。针对配电…

Sparse Fuse Dense: 向高质量的深度补全3D检测迈进

点云的稀疏性:在远距离和遮挡区域提供的信息较差,导致难以生成精确的3D边界框。 出现了多模态融合。 图像和点云的不同表示方式使得它们难以融合,导致性能不佳。 论文提出了一种新颖的多模态框架SFD(Sparse Fuse Dense&#xf…

二层交换机工作原理与MAC地址介绍

目录 MAC地址介绍 MAC地址的组成 MAC地址分类 MAC地址的作用 二层交换机介绍 MAC地址表的定义 MAC地址表项类型 二层交换机对数据帧的处理动作 MAC地址介绍 MAC地址(Media Access Control Address),直译为媒体存取控制位地址 MAC地址的组成 MA…

华为OD机试真题(Java),图片整理(100%通过+复盘思路)

一、题目描述 Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。 Lily使用的图片使用字符"A"到"Z"、“a"…

JMeter 环境配置

目录 前言: 一、 JDK安装 二、 安装JMeter 三、 安装插件 前言: JMeter是一款功能强大的性能测试工具,用于模拟多种负载条件下的应用程序行为,环境配置是jmeter学习的第一步,每次换电脑就得重新配置,为…

Spark RDD dataframe嘿嘿

RDD(Resilient Distributed Datasets)可扩展的弹性分布式数据集,RDD是spark最基本的数据抽象,RDD表示一个只读、分区且不变的数据集合,是一种分布式的内存抽象,与分布式共享内存(Distributed Sh…