一文读懂Java中的设计模式——模板方法,给大家的代码添点料!

news2024/11/16 5:41:06

模板方法概念

模板设计模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

模板方法类关系图

模板方法代码

设计模板抽象类Vehicle提供抽象方法start、stop、alarm,最关键的是提供方法run,里面限定了start、stop、alarm的运行顺序!

注意:run方法只是限定各个方法的运行顺序,并不关注每个方法的具体实现细节

public abstract class Vehicle {
    //首先是车要能发动
    public abstract void start();

    //能发动,那还要能停下来
    public abstract void stop();

    //喇叭会出声音,是滴滴叫,还是哔哔叫
    public abstract void alarm();

    //那模型应该会跑吧,管是人推的,还是电力驱动,总之要会跑
    public void run() {
        // 先发动汽车
        this.start();
        // 引擎开始轰鸣
        this.alarm();
        // 到达目的地就停车
        this.stop();
    }

设计类Car继承Vehicle,重写了start、stop和alarm方法

public class Car extends Vehicle {

    @Override
    public void start() {
        
        System.out.println("汽车通过发动机启动");
        
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("汽车通过踩刹车方式停车");
        
    }

    @Override
    public void alarm() {
        // TODO Auto-generated method stub
        System.out.println("汽车按喇叭,嘀嘀嘀");
        
    }

}

设计类Bike继承Vehicle,重写了start、stop和alarm方法

public class Bike extends Vehicle {

    @Override
    public void start() {
        
        System.out.println("自行车通过链条齿轮启动");
        
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("自行车通过手闸方式停车");
        
    }

    @Override
    public void alarm() {
        // TODO Auto-generated method stub
        System.out.println("自行车按铃,铃铃铃");
        
    }

}

编写模板方法测试类,可以看到不同的实例执行抽象类Vehicle的 run方法后,输出了各自start、stop、alarm方法的实现

public class TestTemplate {

    public static void main(String[] args) {
        
        Vehicle car=new Car();
        car.run();
                
        
        Vehicle bike=new Bike();
        bike.run();

    }

}

运行结果

汽车通过发动机启动
汽车按喇叭,嘀嘀嘀
汽车通过踩刹车方式停车
自行车通过链条齿轮启动
自行车按铃,铃铃铃
自行车通过手闸方式停车

如果想下载源码,可以下载

https://download.csdn.net/download/liwenxiang629/88628190

一句话总结模板方法

抽象类中的方法run能够限定各个子类方法start、stop、alarm的运行顺序,而并不关注每个方法的具体实现细节

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!


 

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

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

相关文章

【动手学深度学习】(十二)现代卷积神经网络

文章目录 一、深度卷积神经网络AlexNet1.理论知识2.代码 二、使用块的网络VGG三、网络中的网络(NiN)1.理论2.代码 四、含并行结的网络(GoogLeNet)2.代码 五、批量归一化1.理论2.代码 六、残差网络ResNet【相关总结】torch.nn.Adap…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中,如果后验分布 p(θx)与先验概率分布 p(θ)在同一概率分布族中,则先验和后验称为共轭分布,先验称为似然函数的共轭先验。 多…

(第18天)RMAN Duplicate 异机复制 Oracle 数据库

RMAN Duplicate 异机复制 Oracle 数据库(第18天) RMAN Duplicate 是从 Oracle 10G 开始出现的功能,但是在 11G 时增加了很多功能,可以通过 Active Database Duplicate 和 Backup-based Duplicate 两种方法实现。 Active database duplicate 功能更加强大,不需要先对源端…

向ChatGPT提特殊问题,可提取原始训练数据!

随着ChatGPT等模型的参数越来越大,预训练数据也呈指数级增长。谷歌DeepMind、华盛顿大学、康奈尔大学等研究人员发现,无论是开源还是闭源模型,在训练过程中皆能记住一定数量的原始训练数据样本。 如果使用特定的恶意攻击,便能轻松地从模型中…

数字化转型,究竟难在哪里?_光点科技

数字化转型已经成为当今商业世界的一项迫切任务。企业纷纷意识到,要在竞争激烈的市场中生存并繁荣,就必须采取数字化策略,以适应不断变化的商业环境。然而,尽管数字化转型带来了许多机会和好处,但许多企业仍然发现这一…

基于Java框架失物招领信息交互平台的设计与实现论文

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

PyCharm连接远程服务器

要求:PyCharm专业版才支持远程服务 一、创建远程连接 先建立本地与远程服务器之间的SSH连接 1、配置连接 2、建立SSH连接,选择文件传输协议 SFTP 3、设置服务器名(可以随意命名) 4、配置 SSH连接 点击 172.18.1.202 配置…

【算法系列篇】递归、搜索和回溯(三)

文章目录 前言什么是二叉树剪枝1. 二叉树剪枝1.1 题目要求1.2 做题思路1.3 代码实现 2. 验证二叉搜索树2.1 题目要求2.2 做题思路2.3 代码实现 3. 二叉搜索树中第k小的元素3.1 题目要求3.2 做题思路3.3 代码实现 4. 二叉树的所有路径4.1 题目要求4.2 做题思路4.3 代码实现 前言…

mybatis高级扩展-批量映射优化-mappers标签中使用package批量注册的前提条件

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

模型部署系列:10x速度提升,Yolov8检测模型稀疏化——CPU上超500FPS

YOLOv8由广受欢迎的YOLOv3和YOLOv5模型的作者 Ultralytics 开发,凭借其无锚设计将目标检测提升到了一个新的水平。YOLOv8 专为实际部署而设计,重点关注速度、延迟和经济性。 [1] 详细内容请参阅 MarkAI Blog [2] 更多资料及工程项目请关注 MarkAI Githu…

RISCV中的寄存器操作

控制状态寄存器指令 (csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi), 使我们可以轻松地访问一些程序性能计数器。对于这些 64 位计数器, 我们一次可以读取 32 位。这些计数器包括了系统时间, 时钟周期以及执行的指令数目。 CSRRW 先读取寄存器的值:tCS…

使用开源技术快速上手 Web 前端开发(内含PPT课件)

11月29日 OpenTiny 参与了华为云开源针对的高校学生在中国人民大学举办的 meetup 交流活动,本次活动演讲主要围绕数据库、Web3、AI大模型、微服务治理、前端等领域展开讨论。OpenTiny 主要为大家分享了 《使用开源技术快速上手Web前端开发》 ,与大家共同探讨前端开发…

AMEYA360 | 太阳诱电汽车电子解决方案

据AMEYA360了解,日前,太阳诱电汽车电子产品相关内容在电子发烧友网站以专题页形式更新。主要内容包含太阳诱电车规级电子元器件产品优势、汽车电子领域应用场景、产品阵容等。 太阳诱电车规级电子元器件以丰富多样的产品阵容助力汽车电子化和智能化。 太…

致远互联-OA wpsAssistServlet 任意文件读取漏洞复现

0x01 产品简介 致远互联-OA 是数字化构建企业数字化协同运营中台,面向企业各种业务场景提供一站式大数据分析解决方案的协同办公软件。 0x02 漏洞概述 致远互联-OA wpsAssistServlet 存在任意文件读取漏洞,攻击者可读取系统密码等敏感信息进一步控制系统。 0x03 复现环境…

第二证券:防御性板块逆势活跃 A股结构性机会轮动

昨日商场慎重张望心境升温,个股跌多涨少。防御性板块中的医药、燃气板块涨幅居前。医药板块中,拓新药业、森萱医药涨超19%,百利天恒、亨迪药业、新赣江等多股涨超10%。 据中国气候网消息,从12月12日夜间初步,新一轮寒…

自定义Axure元件库及原型图泳道图的绘制(详细不同类的案例)

目录 前言 一.自定义元件库 1.1 自定义元件库的作用 1.2 自定义元件的操作 二.流程图 2.1 流程图的作用 2.2 绘制流程图 2.3 简易流程图案例 三.泳道图 3.1 泳道图的作用 3.2 流程图和泳道图的区别 3.3 绘制泳道图 四.绘制前的准备 五.案例 4.1 门诊模块案例 4.2 …

Java面向对象(高级)-- 包装类(wrapper)的使用

文章目录 一、概念(1)为什么需要包装类(2) 有哪些包装类(3)总结 二、包装类(1)自定义包装类(2) 包装类与基本数据类型间的转换2.1 为什么需要转换2.2 装箱2.2…

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明 部署gb28181和zlm主要需要构建两个镜像,第一个为基础镜像,以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile,以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建 整个基础镜像的构…

防火墙无非就这8种类型,小白完全不用怕!

你们好,我的网工朋友。 当我们谈到网络开放性带来的安全挑战时,都会想起黑客、病毒、恶意软件等等。 而正是因为这些威胁,让网络安全变成了网络世界里的重要议题,如果说起怎么保护网络安全,基本上我们都会第一时间想…

Java8新特性:函数式(Functional)接口

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…