设计模式之模板方法模式详解(下)

news2024/10/6 10:30:17
3)钩子方法的使用
1.概述

钩子方法的引入使得子类可以控制父类的行为。

2.结构图

在这里插入图片描述

3.代码实现

将公共方法和框架代码放在抽象父类中

abstract class DataViewer {
    //抽象方法:获取数据
    public abstract void GetData();

    //具体方法:转换数据
    public void ConvertData() {
        System.out.println("将数据转换为XML格式。");
    }

    //抽象方法:显示数据
    public abstract void DisplayData();

    //钩子方法:判断是否为XML格式的数据
    public boolean IsNotXMLData() {
        return true;
    }

    //模板方法
    public void Process() {
        GetData();
        //如果不是XML格式的数据则进行数据转换
        if (IsNotXMLData()) {
            ConvertData();
        }
        DisplayData();
    }
}

钩子方法为IsNotXMLData(),其返回类型为boolean类型,在子类中可以根据实际情况覆盖该方法。

显示XML格式数据的具体子类XMLDataViewer

public class XMLDataViewer extends DataViewer {
    //实现父类方法:获取数据
    @Override
    public void GetData() {
        System.out.println("从XML文件中获取数据。");
    }

    //实现父类方法:显示数据,默认以柱状图方式显示,可结合桥接模式来改进
    @Override
    public void DisplayData() {
        System.out.println("以柱状图显示数据。");
    }

    //覆盖父类的钩子方法
    @Override
    public boolean IsNotXMLData() {
        return false;
    }
}

在具体子类XMLDataViewer中覆盖了钩子方法IsNotXMLData(),返回false,表示该数据已为XML格式,无须执行数据转换方法ConvertData()。

客户端代码如下

public class Client {
    public static void main(String[] args) {
        DataViewer dv;
        dv = new XMLDataViewer();
        dv.Process();
    }
}
4)总结
1.优点
  • 在父类中定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。

  • 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。

  • 在模板方法模式中通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便。

2.缺点

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,可结合桥接模式进行设计。

3.适用场景
  • 对复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,将可以改变的细节由其子类来实现。

  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

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

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

相关文章

【传输层】

文章目录 传输层传输服务和协议传输层 vs. 网络层Internet传输层协议多路复用/解复用在发送方主机多路复用在接收方主机多路解复用 多路解复用工作原理无连接(UDP)多路解复用无连接传输:UDPUDP:用户数据报协议UDP校验和 传输层 目…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“落地项目管理标准,打赢班长的战争”。大会将于5月25-26日在北京举办&am…

excel中vlookup查找值必须在table_array的第一列,有其他办法吗有XLOOKUP

vlookup查找值必须在table_array的第一列,有其他办法吗?有XLOOKUP。 vlookup 查找如下,查找值必须在table_array的第一列 如果下面,编码和名称交换位置,就不能使用vlookup查找了。 XLOOKUP 查找如下

电脑桌面便签软件哪个好?好用的电脑桌面便签

电脑作为我们日常工作的重要工具,承载着大量的任务和项目。当工作任务繁重时,如何在电脑桌面上高效管理这些任务就显得尤为重要。这时,选择一款优秀的桌面便签软件,无疑会给我们带来极大的便利。 一款好的桌面便签软件&#xff0…

注意力机制基本思想(一)

​🌈 个人主页:十二月的猫-CSDN博客🔥 系列专栏: 🏀《深度学习基础知识》 相关专栏: ⚽《机器学习基础知识》 🏐《机器学习项目实战》 🥎《深度学习项目实战…

2024年华中杯B题论文发布+数据预处理问题一代码免费分享

【腾讯文档】2024年华中杯B题资料汇总 https://docs.qq.com/doc/DSExMdnNsamxCVUJt 行车轨迹估计交通信号灯周期问题 摘要 在城市化迅速发展的今天,交通管理和优化已成为关键的城市运营问题之一。本文将基于题目给出的数据,对行车轨迹估计交通信号灯…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接,在3.8以后好像已经不支持这个种链接方式了, #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登:“一切非 Rust 项目均为非法”😎 什么是 GUI 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 现在的应用开发,是既要功…

云从科技AI智能体云月亮相中国铁建GSF项目展示中心

近日,中国铁建大湾区科学论坛永久会址项目综合展示体验中心(以下简称“中国铁建GSF项目展示中心”)迎来了一位特别的客服——云月数智人。云月是云从从容多模态大模型的融合承载体——AI智能体(AI-Agent),她…

设计模式系列:适配器模式

简介 适配器模式(Adapter Pattern)又称为变压器模式,它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。 适配器模式有两种…

免费的浏览器翻译插件——easypubmed

支持谷歌和edge浏览器,应用商店直接检索安装就可。 非常方便,无论是打算文字还是查单词,只要选中按D,就可以一键翻译啦。 最重要是免费,而且添加了小牛翻译引擎哦。 当然了,此插件本身是给医学生准备的。Pu…

深度学习--CNN应用--VGG16网络和ResNet18网络

前言 我们在学习这两个网络时,应先了解CNN网络的相关知识 深度学习--CNN卷积神经网络(附图)-CSDN博客 这篇博客能够帮我们更好的理解VGG16和RetNet18 1.VGG16 1.1 VGG简介 VGG论文网址:VGG论文 大家有兴趣的可以去研读一下…

JAVA面向对象(下 )(一、继承和方法重写)

一、继承 1.1 什么是继承 生活中继承是指: 继承财产>延续财产 继承/遗传 父母的长相,基因 > 延续上一代的基因 继承技能、专业、职位 >延续 继承中华民族的传统文化 > 延续 青出于蓝而胜于蓝 或 长江后浪推前浪,前浪被拍在…

es安装中文分词器

下载地址,尽量选择和自己本地es差不多的版本 https://github.com/infinilabs/analysis-ik/releases 下载好,解压,把里面的文件放到es的plugins/ik目录下 把plugin-descriptor.properties文件里的es版本改成自己对应的 再启动es,能…

十、OOP面向对象程序设计(五)

1、什么是接口以及接口的运用 1)接口定义 Java接口(Interface),是一些列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能。) 2)接口定义的一般形式 修饰符:…

抖音小店怎么选品?这些超级容易爆单的选品方法,很少有人告诉你!

哈喽~我是电商月月 抖音小店的运营过程中,选品是非常重要的,好的商品不用宣传,就有人看 今天我就来给大家分享几个选品技巧,学会后商品一上架就有流量! 利用数据选品 1.“蝉妈妈”的数据排行榜选品 “蝉妈妈”能看…

在Ubuntu中如何查看NASM -f选项支持的输出格式

2024年4月19日,周五下午 用下面这条指令就可以了: nasm -hf

v1.9.2-httpsok快速申请免费SSL证书

v1.9.2-🔥httpsok快速申请免费SSL证书 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞定SSL证书自动续期 更新日志 V1…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来,VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术,VR全景展厅不仅能够提供身临其境的观展体验,而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

Pytorch-自动微分模块

🥇接下来我们进入到Pytorch的自动微分模块torch.autograd~ 自动微分模块是PyTorch中用于实现张量自动求导的模块。PyTorch通过torch.autograd模块提供了自动微分的功能,这对于深度学习和优化问题至关重要,因为它可以自动计算梯度&#xff0c…