设计模式 模板方法模式

news2024/9/25 11:13:12

01.如果接到一个任务,要求设计不同型号的悍马车
在这里插入图片描述
02.设计一个悍马车的抽象类(模具,车模)

public abstract class HummerModel {
	/*
	 * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正
	 * 是要能够发动起来,那这个实现要在实现类里了
	 */
	public abstract void start(); 
	 
	//能发动,那还要能停下来,那才是真本事
	public abstract void stop(); 
	
	//喇叭会出声音,是滴滴叫,还是哔哔叫
	public abstract void alarm(); 
	 
	//引擎会轰隆隆的响,不响那是假的
	public abstract void engineBoom(); 
	 
	//那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑
	public abstract void run(); 
} 

03.具体不同版本的悍马,这个是抽象类的具体子类

H1 型号悍马的定义如下:

public class HummerH1Model extends HummerModel { 
	
   @Override 
	public void alarm() { 
		 System.out.println("悍马H1鸣笛..."); 
	 } 
	 
	@Override
	public void engineBoom() { 
		 System.out.println("悍马H1引擎声音是这样在..."); 
	 } 
	 
	@Override
	public void start() { 
		 System.out.println("悍马H1发动..."); 
	 }
	  
	@Override
	public void stop() { 
		 System.out.println("悍马H1停车..."); 
	 } 
	 
	/*
	* 这个方法是很有意思的,它要跑,那肯定要启动,停止了等,也就是要调其他方法
	 */
	@Override
	public void run() { 
	 
		 //先发动汽车
		 this.start(); 
		 
		 //引擎开始轰鸣
		 this.engineBoom(); 
		 
		 //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
		 this.alarm(); 
		 
		 //到达目的地就停车
		 this.stop(); 
	 } 
} 

然后看悍马 H2 型号的实现:

public class HummerH2Model extends HummerModel { 

	@Override
	public void alarm() { 
		 System.out.println("悍马H2鸣笛..."); 
	 } 
	
	@Override
	public void engineBoom() { 
		 System.out.println("悍马H2引擎声音是这样在..."); 
	 } 
	
	@Override
	public void start() { 
		System.out.println("悍马H2发动..."); 
	 } 
	
	@Override
	public void stop() { 
	 	System.out.println("悍马H1停车..."); 
	 } 
	 
	/*
	 * H2要跑,那肯定要启动,停止了等,也就是要调其他方法
	 */
	@Override
	public void run() { 
	 
		 //先发动汽车
		 this.start(); 
		 
		 //引擎开始轰鸣
		 this.engineBoom(); 
		 
		 //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
		 this.alarm(); 
		 
		 //到达目的地就停车
		 this.stop(); 
	 } 
}

然后程序写到这里,你就看到问题了,run 方法的实现应该在抽象类上(子类改写的都一样),不应该在实现类上,好,我们修改一下类图和实现:
在这里插入图片描述

就把 run 方法放到了抽象类中,那代码也相应的改变一下,先看 HummerModel.java:

04.修改后的抽象类

public abstract class HummerModel { 
	/*
	 * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正
	 * 是要能够发动起来,那这个实现要在实现类里了
	 */
	public abstract void start(); 
	 
	//能发动,那还要能停下来,那才是真本事
	public abstract void stop(); 
	 
	//喇叭会出声音,是滴滴叫,还是哔哔叫
	public abstract void alarm(); 
	 
	//引擎会轰隆隆的响,不响那是假的

	public abstract void engineBoom(); 
 
	//那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑
	public void run() { 
	 
	 //先发动汽车
	 this.start(); 
	 
	 //引擎开始轰鸣
	 this.engineBoom(); 
	 
	 //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
	 this.alarm(); 
	 
	 //到达目的地就停车
	 this.stop(); 
	 } 
}

05.修改后的抽象类的子类:

public class HummerH1Model extends HummerModel { 

	 @Override 
	public void alarm() { 
		 System.out.println("悍马H1鸣笛..."); 
	 } 
	 
	@Override
	public void engineBoom() { 
		 System.out.println("悍马H1引擎声音是这样在..."); 
	 } 
	 
	@Override
	public void start() { 
		 System.out.println("悍马H1发动..."); 
	  }
	   
	@Override
	public void stop() { 
		 System.out.println("悍马H1停车..."); 
	 } 
 
} 
public class HummerH2Model extends HummerModel { 

	@Override
	public void alarm() { 
		 System.out.println("悍马H2鸣笛..."); 
	 } 
	 
	@Override
	public void engineBoom() { 
	 	System.out.println("悍马H2引擎声音是这样在..."); 
	 } 
	 
	@Override
	public void start() { 
		 System.out.println("悍马H2发动..."); 
	 } 
	 
	@Override
	public void stop() { 
		 System.out.println("悍马H2停车..."); 
	 } 
 
}

06.运行程序
在这里插入图片描述

public class Client { 
	public static void main(String[] args) { 
	 
	 //客户开着H1型号,出去遛弯了
	 HummerModel h1 = new HummerH1Model(); 
	 h1.run(); //汽车跑起来了;
	 
	 //客户开H2型号,出去玩耍了
	 HummerModel h2 = new HummerH2Model(); 
	 h2.run(); 
	 } 
}

在这里插入图片描述

07.客户只要在 run 的过程中,听到或看都成了呀,暴露那么多的方法干啥?把抽象方法保护起来
在这里插入图片描述
把抽象类上的四个方法设置为 protected 访问权限,好了,既然客户不关心这几个方法,而且这四个方法都是由子类来实现的,那就设置成 protected 模式。咦~,那还有个缺陷,run 方法既然子类都不修改,那是不是可以设置成 final 类型呢?是滴是滴,类图如下:
在这里插入图片描述

public abstract class HummerModel { 
	/*
	 * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正
	 * 是要能够发动起来,那这个实现要在实现类里了
	 */
	protected abstract void start(); 
	 
	//能发动,那还要能停下来,那才是真本事
	protected abstract void stop(); 
	 
	//喇叭会出声音,是滴滴叫,还是哔哔叫
	protected abstract void alarm(); 
	 
	//引擎会轰隆隆的响,不响那是假的
	protected abstract void engineBoom(); 
	 
	//那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑
	final public void run() { 
 
		 //先发动汽车
		 this.start(); 
		 
		 //引擎开始轰鸣
		 this.engineBoom(); 
		 
		 //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
		 this.alarm(); 
		 
		 //到达目的地就停车
		 this.stop(); 
	 } 
} 

大家请看这个 run 方法,他定义了调用其他方法的顺序,并且子类是不能修改的,这个叫做模板方法;start、stop、alarm、engineBoom 这四个方法是子类必须实现的,而且这四个方法的修改对应了不同的类,这个叫做基本方法,基本方法又分为三种:在抽象类中实现了的基本方法叫做具体方法;在抽象类中没有实现,在子类中实现了叫做抽象方法,我们这四个基本方法都是抽象方法,由子类来实现的;还有一种叫做钩子方法,

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

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

相关文章

AI训练,为什么需要GPU?

随着人工智能热潮,GPU成为了AI大模型训练平台的基石,决定了算力能力。为什么GPU能力压CPU,成为炙手可热的主角呢?首先我们要先了解一下GPU的分类。提到分类,就得提及到芯片。 半导体芯片分为数字芯片和模拟芯片。其中&…

浅谈亚信安慧AntDB-M条件下推

概述 “下推”是数据库管理系统优化查询性能的一种思路,集中式数据库支持谓词下推和投影下推,通过将Filter(过滤)和Project(映射)算子在算子数中向下移动,提前对行/列进行裁剪,减少…

从嵌套事务的日志看MyBatis的sqlSession生命周期

service层业务代码 Override public void test(){QueryWrapper<StoreRebateCalculateLog> queryWrapper;queryWrapper new QueryWrapper<>();queryWrapper.eq("delete_flag", 0);//执行查询A,以非事务方式执行List<StoreRebateCalculateLog> sto…

代码学习第24天----回溯算法

随想录日记part24 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.10 主要内容&#xff1a;回溯算法在代码学习中尤其重要&#xff0c;所以今天继续加深对其的理解&#xff1a;1&#xff1a;递增子序列 &#xff1b;2.全排列 &#xff1b;3.全排列II 491.递…

Android:adb命令

执行adb命令的窗口如下 Mac或Linux系统里的终端窗口&#xff1b; window系统运行输入cmd打开的指令窗口&#xff1b; Android Studio 里控制下面的Terminal窗口 1. 查看已链接的设备和模拟器 adb devices -l 2. 查看Android内核版本号 adb shell getprop ro.build.version.re…

近期TRO案件盘点,外观专利又双叒叕成维权高发地

近期&#xff0c;多个权利人进行外观专利维权&#xff0c;众多国内卖家被告&#xff0c;建议卖家自查。 案例一&#xff1a;尿布收纳袋——商标外观专利版权 案例关于这款尿布收纳袋&#xff0c;涉及商标、外观专利和版权。 &#xff08;图源网络&#xff0c;侵删&#xff09…

HarmonyOS NEXT应用开发之跨文件样式复用和组件复用

介绍 本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中&#xff0c;我们通常需要使用相同功能和样式的ArkUI组件&#xff0c;例如购物页面中会使用相同样式的Button按钮、Text显示文字&#xff0c;我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组…

汽车KL15、KL30、ACC的区别

文章目录 前言一、KL30是什么&#xff1f;二、KL15是什么&#xff1f;KL15信号的演变 三、为啥用KL15、KL30呢&#xff1f; 前言 相信刚接触汽车电子的伙伴都会有一个疑惑&#xff0c;什么是KL15?什么是KL30? 内心一脸懵逼…… KL是德语Klemme的缩写&#xff0c;指的是ECU的…

软件测评中心分享:软件鉴定测试与验收测试有什么联系和区别?

1、软件鉴定测试   软件鉴定测试是在软件开发完成后进行的一个核心环节&#xff0c;是通过对软件进行功能性、性能、安全性等方面的综合测试&#xff0c;来验证软件是否符合规定的需求和标准。 2、软件验收测试   软件验收测试是软件开发工作结束后的最后一个环节&#xf…

深入理解 CSS:基础概念、注释、选择器及优先级

在构建网页的过程中&#xff0c;我们不仅需要HTML来搭建骨架&#xff0c;还需要CSS来装扮我们的网页。那么&#xff0c;什么是CSS呢&#xff1f;本文将带大家了解css的基础概念&#xff0c;注释、选择器及优先级。 一、CSS简介 1.1 什么是CSS CSS&#xff0c;全称为Cascadin…

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术&#xff0c;蓝牙主要负责位置服务&#xff0c;LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”&#xff0c;是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术&#xff0c;抗干…

VS2019 C++ NetCDF配置

原链接1 原链接2 做个备份 1.下载对应的NetCDF-C和C库 官网下载 选择64位的NetCDF4安装版&#xff08;没有DAP的&#xff09; 现在官网已经没有NetCDF-C 4.7.3 版本了&#xff0c;网上别人提供了新的下载地址&#xff1a;NetCDF各个版本&#xff08;Index of /library/net…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

Emotion Prompt-LLM能够理解并能通过情感刺激得以增强

Large Language Models Understand and Can be Enhanced by Emotional Stimuli 情感智能对我们的日常行为和互动产生了显著的影响。尽管大型语言模型&#xff08;LLMs&#xff09;被视为向人工通用智能迈进的一大步&#xff0c;在许多任务中表现出色&#xff0c;但目前尚不清楚…

政务服务中心怎么用AI交互数字人打造政务服务新名片?

西海岸新区政务服务中心推出AI交互数字人“灵灵”&#xff0c;以一体机终端形式提供便捷、智能的服务体验&#xff0c;并担任政务数字人主播宣传政策信息。 *图片源于网络 并且AI交互数字人灵灵还承担了政务数字人主播的工作&#xff0c;以数字人短视频的形式&#xff0c;向市…

xercesc库中文保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #include "XercesC_Test.h"#if 1//参考链接&…

SpringBoot3使用响应Result类返回的响应状态码为406

Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation] 解决方法&#xff1a;Result类上加上Data注解

软考系统分析师2024上半年报名流程及注意事项

2024年5月软考系统分析师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的考友…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包javafx项目篇)

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

力扣每日一题 2024/3/21 频率跟踪器

题目描述 用例说明 思路讲解 看到统计数字频率或者出现次数很容易想到用哈希表&#xff0c;但是一个哈希表count将数字和数字出现次数映射起来似乎不太够&#xff0c;如果需要统计数字出现次数的频率的话还是需要进行一次遍历&#xff0c;时间复杂度为O(n)&#xff0c;有没有常…