模板方法模式(java)

news2025/1/10 20:55:04

目录

结构

案例

代码实现

抽象类

具体子类

测试类

优缺点

优点

缺点


结构

模板方法(Template Method)模式包含以下主要角色:

  • 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。

    • 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

    • 基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:

      • 抽象方法(Abstract Method) :一个抽象方法由抽象类声明、由其具体子类实现。

      • 具体方法(Concrete Method) :一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。

      • 钩子方法(Hook Method) :在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

        一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型。

  • 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。

案例

【例】炒菜

炒菜的步骤是固定的,分为倒油、热油、倒蔬菜、倒调料品、翻炒等步骤。现通过模板方法模式来用代码模拟。类图如下:

代码实现

抽象类

package template;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 抽象步骤类
 * @date: 2023/7/20 18:01
 */
public abstract class AbstractClass {

    public void cookProcess(){
        this.pourOil();
        this.heatOil();
        this.pourVegetable();
        this.pourSauce();
        this.fry();
    }


    public void pourOil() {
        System.out.println("倒油");
    }

    //第二步:热油是一样的,所以直接实现
    public void heatOil() {
        System.out.println("热油");
    }

    //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心)
    public abstract void pourVegetable();

    //第四步:倒调味料是不一样
    public abstract void pourSauce();


    //第五步:翻炒是一样的,所以直接实现
    public void fry(){
        System.out.println("炒啊炒啊炒到熟啊");
    }


}

具体子类

菜心类

package template;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 菜心类
 * @date: 2023/7/20 18:05
 */
public class CaiXin extends AbstractClass{

    @Override
    public void pourVegetable() {
        System.out.println("倒菜心");
    }

    @Override
    public void pourSauce() {
        System.out.println("加蒜蓉");
    }

}

包菜类

package template;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 包菜类
 * @date: 2023/7/20 18:04
 */
public class BaoCai extends AbstractClass{


    @Override
    public void pourVegetable() {
        System.out.println("倒包菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("加辣椒");
    }
}

测试类

package template;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 测试类
 * @date: 2023/7/20 17:55
 */
public class Client {

    public static void main(String[] args) {

        // 实例化菜心对象
        CaiXin caiXin = new CaiXin();
        // 炒菜心
        caiXin.cookProcess();

        System.out.println("__________");

        // 炒包菜
        BaoCai baoCai =  new BaoCai();
        baoCai.cookProcess();

    }

}

优缺点

优点

  • 提高代码复用性

    将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。

  • 实现了反向控制

    通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 ,并符合“开闭原则”。

缺点

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。

  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

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

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

相关文章

基于SPDK-vhost的云原生Kubevirt虚拟化存储IO的优化方案

摘要 本文主要介绍针对云原生kubernetes虚拟化IO的应用场景,在Kubevirt中引入SPDK-vhost的支持,来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。 云原生Kube…

Failed to load response data:No data found for resource with given identifier

前言 关于跨域的另一种解释 前端Ajax访问后端,表单提交,有一个接口报错,其他都没问题 网上看了很多案例方法,均不适用;早上改代码过程中,改好了,话不多说,上原因 原因 提前关闭页…

CentOS7系统下Docker容器基于TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验…

辅助笔记-linux新增硬盘

linux新增硬盘 文章目录 linux新增硬盘步骤1:添加硬盘步骤2:对硬盘进行分区步骤3:对硬盘分区进行格式化步骤4:将硬盘分区挂载到目录上步骤5:设置“永久挂载” 本文主要参考B站视频“P59_韩顺平Linux_增加磁盘应用实例”…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章:IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

centos7下载mysql5.7,jdk1.8

前言:最近公司服务器从阿里云换到腾讯云了(为了省钱啧啧),所以这个相关环境的配置工作,由我来负责了。 1.Mysql 1.下载 第一步: rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11…

【算法基础:数学知识】4.4 快速幂

文章目录 快速幂例题列表875. 快速幂⭐⭐⭐⭐⭐(重要!)代码写法1——递归代码写法2——迭代递归写法 与 迭代写法的 对比 876. 快速幂求逆元🚹(需要理解逆元的概念)TODO乘法逆元介绍解法代码 快速幂 https…

python机器学习(三)特征预处理、鸢尾花案例--分类、线性回归、代价函数、梯度下降法、使用numpy、sklearn实现一元线性回归

K-近邻算法(K-Nearest Neighboor) 特征预处理 数据预处理的过程。数据存在不同的量纲、数据中存在离群值,需要稳定的转换数据,处理好的数据才能更好的去训练模型,减少误差的出现。 标准化 数据集的标准化对scikit-learn中实现的大多数机器…

WPF实战项目十(API篇):引入工作单元UnitOfWork

1、通过github地址:https://github.com/arch/UnitOfWork,下载UnitOfWork的代码,将工作单元部分的代码引用到自己的项目,新增UnitOfWork文件夹。 2、在UnitOfWork文件夹下引用UnitOfWork下的IPagedList.cs、PagedList.cs类&#xf…

探索物联网HMI的端口转发和NAT功能

前言 端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输,工作人员通过外部网络便可安全访问到内网设备,实现设备的状态监测。接下来小编将为大家介绍支持端口转发和NAT功能的虹科物联网HMI是如何帮助用户实现内网穿透。…

(css)自定义登录弹窗页面

(css)自定义登录弹窗页面 效果&#xff1a; 代码&#xff1a; <!-- 登录弹窗 --> <el-dialog:visible.sync"dialogVisible"title"用户登录"width"25%"centerclass"custom-dialog":show-close"false":close-on-cli…

uniapp 条件编译

// #ifdef %PLATFORM%仅在某平台存在&#xff1b;%PLATFORM%为平台名称// #ifndef %PLATFORM%除了某平台均存在&#xff1b;// #endifendif 一定要搭配使用%PLATFORM%&#xff1a; VUE3 HBuilderX 3.2.0 详情 APP-PLUS App APP-PLUS-NVUE或APP-NVUE App nvue 页面 APP-ANDRO…

Redis八股学习记录1Redis面试常问问题from小林coding

Redis八股学习记录1Redis简介与数据结构from小林coding Redis简介Redis数据结构String底层实现List底层实现Hash底层实现Set底层实现Zset Redis线程模型Redis持久化AOF日志的实现AOF日志重写机制 RDB快照实现混合持久化Redis集群主从复制哨兵模式切片集群模式Redis的集群脑裂问…

【C++初阶】仿函数和priority_queue的模拟实现(附源码)

一.仿函数 仿函数&#xff0c;顾名思义就是模仿函数&#xff0c;它其实是一个类&#xff0c;类里面重载了运算符&#xff08;&#xff09;&#xff0c;在调用这个重载的运算符时&#xff0c;让我们感觉是调用函数一样&#xff0c;可以说相当于C语言里的函数指针一样&#xff0c…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…

视频拼接得AI三维生成方案-开端(一)

想使用二维得图像生成三维得空间图像&#xff0c;英伟达有完整得方案&#xff0c;开源&#xff0c;但是三维拼接不一样&#xff0c;只需要二维&#xff0c;并且要实时&#xff0c;如何生成是我每天都在思考得东西。 cnn 提取特征器和自编码 在训练细胞神经网络时&#xff0c;问…

【C++】多态案例— —计算器类

author&#xff1a;&Calton tag&#xff1a;C topic&#xff1a;【C】多态案例— —计算器类 website&#xff1a;黑马程序员C date&#xff1a;2023年7月23日 目录 多态概要 案例实现 原理剖析 多态概要 多态是C三大特性之一&#xff08;封装、继承、多态&#xff…

FreeRTOS源码分析-5 系统延时详解

目录 1 系统延时API详解 2 相对延时与绝对延时的区别 3 相对延时与绝对延时的应用 4 系统延时函数实现原理 4.1 vTaskDelay业务流程 4.2 vTaskDelayUntil业务流程 5 任务挂起/任务恢复详解 1 系统延时API详解 TickType_t 实际上是uint32_t类型 2 相对延时与绝对延时的区…

MATLAB | 绘制scatter散点图时如何自动标注超范围散点?

本文来讲一下如何自动标注超出坐标区域范围的点&#xff0c;例如这样&#xff1a; 如图右侧的红叉代表横坐标超过范围的点的纵坐标 &#xff0c;当然下方的红叉代表纵坐标超过范围点的横坐标。 本文使用的自己编写的工具函数scatterOOR将被放在文末&#xff0c;先讲讲咋用哈&a…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…