Java设计模式—模板方法模式

news2024/12/24 10:23:13

前言:模板方法模式是模板模式的一个具体实现,它定义了一个抽象类,其中包含一个模板方法和若干个基本方法。其中模板方法定义了算法骨架,而基本方法则由子类来实现。因此,模板方法在定义算法的结构方面提供了支持,而基本方法则在定义算法的具体实现细节方面提供了支持。

文章目录:

  1. 概念
  2. 作用
  3. 优、缺点
  4. 代码案例

一、模板模式的概念

模板模式是一种行为设计模式,定了一个操作中的算法骨架,而且将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构情况下,既可重定义该算法的某些特定步骤

简单的理解就是:模板模式是一种行为设计模式,提供了一个框架来定义执行算法的步骤,子类可以实现具体的步骤,同时保留算法的结构。

二、模板方法模式的作用

模板方法模式的主要作用如下:

  • 模板方法将公共的算法步骤封装在父类中,子类只需要实现自己特有的算法步骤即可。这样可以避免重复编写相同的代码,提高代码复用性。

  • 当需求变更时,只需要修改子类中的算法步骤即可,不需要修改父类的算法结构,因此可以减少对系统其他部分的影响。

  • 模板方法模式符合开闭原则,即对扩展开放,对修改关闭。通过定义抽象父类,可以在不修改原有代码的情况下扩展系统功能。

  • 客户端只需要调用模板方法即可,无需关心具体实现细节,降低了客户端的使用难度。

三、模板方法模式的优、缺点

优点:

  • 提高代码复用性

  • 便于维护和扩展

  • 实现了开闭原则

  • 简化了客户端调用

缺点:

  • 增加了系统的抽象性和理解难度:由于模板方法模式将算法步骤封装在抽象父类中,因此增加了系统的抽象性和理解难度。

  • 可能会带来过多的子类:如果模板方法中的算法步骤比较多,可能需要为每个步骤都定义一个子类,这样可能会导致系统中存在过多的子类,简称:“类爆炸”。

  • 不适用于所有场景:模板方法模式适用于具有相同或类似流程的算法,但不适用于那些完全不同的算法。

四:模板方法模式的代码案例

以老师上课为案例

UML 类图

1)创建抽象类

package edu.nf;

/**
 * @author 半杯可可
 * @date 2023/6/5
 */
public abstract class Teacher {

    /**
     * 所有老师上课都是一样的点名
     */
    public void call() {
        System.out.println("上课点名");
    }

    /**
     * 上课,不同的老师做不同的实现
     */
    public abstract void lesson();

    /**
     * 布置作业,不同专业布置不同的内容
     */
    public abstract void homework();

    /**
     * 这就是模版方法,将业务执行的步骤顺序封装在这个方法中
     * 并暴露给客户端调用
     */
    public void work() {
        call();
        //调用的是子类实现的方法
        lesson();
        //判断钩子是否剔除了此方法
        if(hock()) {
            //调用的是子类实现的方法
            homework();
        }
    }

    /**
     * 钩子方法,子类负责重写这个方法来剔除不需要的步骤,
     * 默认值为true表示不剔除
     * @return
     */
    protected boolean hock() {
        return true;
    }
}

2)创建一个JavaTeacher类继承Teacher抽象类

package edu.nf;

/**
 * @author 半杯可可
 * @date 2023/6/5
 */
public class JavaTeacher extends Teacher{

    @Override
    public void lesson() {
        System.out.println("上Java课程");
    }

    @Override
    public void homework() {
        System.out.println("布置Java作业");
    }
}

3)再创建一个EnglishTeacher类继承Teacher抽象类

package edu.nf;

/**
 * @author 半杯可可
 * @date 2023/6/5
 */
public class EnglishTeacher extends Teacher {

    @Override
    public void lesson() {
        System.out.println("上英语课");
    }

    @Override
    public void homework() {
        System.out.println("布置英语作业");
    }

    @Override
    protected boolean hock() {
        return false;
    }
}

4)代码Main测试

package edu.nf;

public class Main {
    public static void main(String[] args) {
        Teacher teacher = new JavaTeacher();
        teacher.work();
    }
}

总结:

模板方法模式是一种简单、易用、灵活的设计模式,可以有效地提高代码的复用性和可维护性,是软件开发中常用的一种设计模式。

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

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

相关文章

springMvc 解决 multipart/form-data 方式提交请求 不能获取非文件类型参数的问题和指定springmvc获取静态资源路径

问题: RequestMapping(value "/test",method RequestMethod.POST)ResponseBodypublic String test(String name,String id,MultipartFile file){System.out.println(name);System.out.println(id);System.out.println(file.getOriginalFilename());ret…

onnx模型的修改与调试demo

主要参考: 模型部署入门教程(五):ONNX 模型的修改与调试 第五章:ONNX 模型的修改与调试 使用netron 可视化模型 读写onnx 构造onnx 创建一个描述线性函数 output axb 的onnx模型。 需要两个节点,第一个…

造轮子--自己封装一个 start

背景 都说不要造轮子,但是青柠认为,有的时候,造个轮子,更有助于清楚详细的业务逻辑,所以咱也自己写一个轮子,搞个系统开发。大体思路就是先搭建基础框架,然后细写业务逻辑,会涵盖主…

图解HTTP书籍学习2

确保Web安全的HTTPS HTTP的缺点 ●通信使用明文(不加密),内容可能会被窃听 ●不验证通信方的身份,因此有可能遭遇伪装 ●无法证明报文的完整性,所以有可能已遭篡改 加密处理防止被窃听 通信的加密 一种方式就是…

【React】类组件,JSX语法,JSX原理,传递参数,条件渲染,列表渲染

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 React使用组件(类组件)JSX语法书写规范JSX插入的内容JSX属性绑定JSX类绑…

前端基础(CSS)——css介绍 常用样式 案例—进化到Bootstrap——进化到Element-UI(未完待续)

目录 引出CSS相关1.css写在哪里?2.css的选择器【重要】(1)标签选择器---div{}(2)id选择器----#div01{}(3)类选择器---class"div01",.dav01{}(4)后代…

saas产品私有化(一) 缓存中间件适配

一.背景 名词解释:私有化一般指的是在对客交付过程中,客户由于自身数据敏感,成本控制等原因要求交付乙方将售卖的服务利用现有甲方的硬件设备或者云服务进行服务的部署. 面向场景:一般特制的是saas化的云服务软件提供商的对特殊客群的场景.其中saas行业中比较起步和规模比较大的…

流氓软件篡改微软EDGE浏览器主页面的那些伎俩

微软的EDGE浏览器很好用,但也很容易被绑架,在网上下载各类免费软件,只要你安装完,十有八九就给你把主页改成某某导航了。尽管打开EDGE直接进入360、毒霸、好123等链接对上网影响也不大,打开这些导航页面后,…

IMX6ULL裸机篇之I2C实验主控代码说明二

一. I2C实验 I2C实验内容: 学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 I2C读写数据时序图: I2C写数据时序图如下: I2C读数据时序图如下: 二. I2C主控读写时序 1. 读数据与写数…

MMDetection学习记录(二)之配置文件

文件结构 config文件 在 config_base_ 文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。 命名风格 {model}_[model setting]_{backbone}_{neck}_[no…

微信小程序项目实例——密码管理器

今日推荐💁‍♂️ 自疫情后武林广场的音乐喷泉再次开启⛲⛲⛲ 坐在最佳视角下观赏了一场久违的表演🎆🎆🎆 🔮🔮🔮🔮🔮往期优质项目实例🔮🔮&…

在三台Linux虚拟机上完成构建集群的前置准备

前言 从现在开始进入到实操阶段,将要在VMware软件中创建多台Linux虚拟机,并进行系统设置。 需要同学们拥有前置知识: VMware的使用经验,知道什么是虚拟机并在VMware中创建过Linux虚拟机(CentOS系统) 熟…

go语言学习——8

文章目录 文件操作打开文件文件读取写文件判读文件或文件夹是否存在拷贝文件统计文件字符命令行参数flag包解析命令行参数 文件操作 os.File封装所有文件相关操作,File是一个结构体 打开文件 package mainimport ("fmt""os" )func main() {file…

重载运算符三个const的作用

const Point operator(const Point &point) const{ } 尝试去理解const,然后搞懂为什么这里放置const。 const 用于修饰其后面跟着的名字,使其为常量,不可被修改。 1.第一个const 的位置后面是函数返回值类型,表明函数返回的是常量&#…

Yolov8涨点神器:创新卷积块NCB和创新Transformer 块NTB,助力检测,提升检测精度

🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀小目标、遮挡物、难样本性能提升 🍉🍉🍉定期更新不同数据集涨点情况 本博客将具有部署友好机制的强大卷积块和变换块,即NCB和NTB,引入到yolo…

spring源码的简单梳理之bean的初始化过程

我们都知道spring中最核心的就是容器的概念,而交于spring管理的对象称为bean对象。在spring中我们这次以xml配置bean的方式进行简单模拟spring创建bean的初始化过程。 1、首先我们先来一起研究一下一个xml文件中bean的结构。 我们可以看到一个bean是一个标签所扩住…

【STM32CubeMX】WS2812彩灯

前言 有时间我就按照网上的时序推理了WS2812的传输时序。之前就推过时序了,但是当时时序好像没对,因为没用逻辑分析仪查看,就以为通过电片机的运行主频,在控制NOP,就能得到us级的延时控制,但是真实的情况是…

EBU6304 Software Engineering 知识点总结_5 项目管理_上

Software architecture 功能需求和软件架构关系紧密,非功能需求是软件架构的选择结果(好的架构运行效率高之类的)。可以以表格或图的形式,比如UML图。 设计难以更改。敏捷开发的早期阶段就是设计系统架构。 好处: …

MMDet3D——数据增强Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆变换实现

在点云的3D感知算法中,常用RandomFlip3D和GlobalRotScaleTrans的数据增强方式,这两个可以有效地增强模型的鲁棒性,提升模型的性能。 transforms[dict(typeRandomFlip3D,sync_2dFalse,flip_ratio_bev_horizontal0.5,flip_ratio_bev_vertical0.…

Qt问题:Qt槽函数是否支持内联?

Qt的信号和槽机制是基于Qt的元对象系统的,这个系统提供了一种在运行时获取对象信息的能力,如类名、信号和槽的数量和类型等。这个系统通过Qt的元对象编译器(moc)在编译时生成额外的代码来实现。 当一个信号被发射时,Q…