设计模式详解-模板模式

类型:行为型模式

实现原理:一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

意图:使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决:一些通用却在每一个子类都重写了的方法造成的冗余

解决方法:将这些通用算法抽象出来。

何时使用:有一些通用的方法。

实现核心:在抽象类实现,其他步骤在子类实现。

应用实例: 盖楼需要地基、水管等

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统膨胀。

使用场景: 1、多个子类共有的逻辑相同的方法 2、重要的、复杂的方法,可以考虑作为模板方法。

实现

步骤 1
创建一个抽象类,它的模板方法被设置为 finalGame.java
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
步骤 2
创建扩展了上述类的实体类。Cricket.java
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}
Football.java
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}
步骤 3
使用 Game 的模板方法 play() 来演示游戏的定义方式。TemplatePatternDemo.java
public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play();      }
}
步骤 4
执行程序,输出结果:Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!这段代码演示了模板方法模式。以下是代码的逐步解释:步骤 1:创建一个抽象类Game,其中包含了三个抽象方法initialize()startPlay()endPlay(),以及一个被声明为final的模板方法play()。模板方法play()定义了游戏的整体框架,包括初始化游戏、开始游戏和结束游戏的流程。步骤 2:创建两个实体类CricketFootball,它们分别扩展了Game类并实现了抽象方法。在每个实体类中,重写了initialize()startPlay()endPlay()方法来定义具体的游戏行为。步骤 3:使用TemplatePatternDemo类来演示游戏的定义方式。在main()方法中,创建了一个Cricket对象和一个Football对象,并通过调用它们的play()方法来演示游戏的整个流程。步骤 4:执行程序并观察输出。它将显示先后执行的游戏流程,包括初始化游戏、开始游戏和结束游戏的消息。输出结果为:Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!这段代码演示了模板方法模式,它通过定义一个抽象类并在其中封装了一个模板方法,在子类中实现具体行为,从而实现了一种固定的流程。这样可以保持流程统一,同时也允许子类根据需要改变特定步骤的实现。

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

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

相关文章

简单认识镜像底层原理详解和基于Docker file创建镜像

文章目录 一、镜像底层原理1.联合文件系统(UnionFS)2.镜像加载原理3.为什么Docker里的centos的大小才200M? 二、Dockerfile1.简介2.Dockerfile操作常用命令 三、创建Docker镜像1.基于已有镜像创建2.基于本地模板创建3.基于Dockerfile创建4.Dockerfile多阶段构建镜像 一、镜像底…

Flutter如何知道页面/组件可见?

在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解…

产品经理如何提高用户画像效果?SIKT模型

产品经理做用户画像,最担心被业务方反馈:没效果。这往往是由用户画像与业务场景脱节造成的。那么我们该如何从业务场景出发,让用户画像更有效?一般来说,我们可以采用SIKT模型解决这个问题。 用户画像 ​ 1、SIK…

Mysql、Oracle 中锁表问题解决办法

MySQL中锁表问题的解决方法: 1. 确定锁定表的原因: 首先,需要确定是什么原因导致了表的锁定。可能的原因包括长时间的事务、大量的并发查询、表维护操作等。 2. 查看锁定信息: 使用以下命令可以查看当前MySQL数据库中的锁定信…

【操作系统】虚拟内存相关分段分页页面置换算法

虚拟内存是什么? 【进程地址空间虚拟地址空间C/C程序地址空间就是那个4G的空间】 虚拟内存是操作系统内核为了对进程地址空间进行管理,而设计的一个逻辑意义上的内存空间概念。在程序运行过程中,虚拟内存中需要被访问的部分会被映射到物理内…

“深入剖析JVM内部工作原理:解密Java虚拟机“

标题:深入剖析JVM内部工作原理:解密Java虚拟机 摘要: 本文将深入剖析Java虚拟机(JVM)的内部工作原理,包括类加载、运行时数据区、垃圾回收、即时编译等关键概念和机制。通过对JVM的解密,我们将…

漏洞指北-VluFocus靶场专栏-工具篇

漏洞指北-VluFocus靶场专栏-番外篇奇技淫巧 🌸1、burp suite 、中国蚁剑工具、Strut2扫描软件地址🌸🌸2、burp suite使用🌸step1 浏览器开启代理,**推荐使用:SwitchyOmega** step2 确认浏览器端口和burp su…

QT操作excel的两种方式 QT基础入门【Excel的操作】

QT操作excel的方式有两种:QAxObject 和QtXlsx QAxObject是通过调用office或者wps组件来实现对excel图表的操作的。只有装office软件或者wps软件就可以实现,但是 如果只装了office软件,有时可以用有时不可以用;如果只装wps软件&a…

nginx反向代理、负载均衡

修改nginx.conf的配置 upstream nginx_boot{# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2server 192.168.87.143 weight100 max_fails2 fail_timeout30s; server 192.168.87.1 weight200 max_fails2 fail_timeout30s;# 这里的…

LVS负载均衡群集部署(LVS-NAT模型实例)

一、集群 1.1集群的含义 Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统。 由多台主机构成,但对外只表现为一个整体。 1.2群集的三种类型 1.2.1负载均衡群集 LB: Load Balancing,负载均衡&#x…

Kafka 消息发送和消费流程

发送消息 流程如下: Producer 端直接将消息发送到 Broker 中的 Leader 分区中Broker 对应的 Leader 分区收到消息会先写入 Page Cache,定时刷盘进行持久化(顺序写入磁盘)Follower 分区拉取 Leader 分区的消息,并保持…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后,可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后,再连接虚拟机就连不上了,于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题,又可以连接上了&#xff…

JAVA知识点梳理

我的博客:lcatake_flume,spark,zookeeper-CSDN博客 看不懂的话进去看看 1.Java的三个版本 JAVASE 基本 JAVAME 微缩 JAVAEE 标准 3.java的特点 面向对象 跨平台:jvm将java文件转变为字节码文件(.class)在多个系统中运 行字…

JS判断是否为移动端

JS判断是否为移动端 var is_mobi navigator.userAgent.toLowerCase().match(/(ipod|iphone|android|coolpad|mmp|smartphone|midp|wap|xoom|symbian|j2me|blackberry|wince)/i) ! null;//检测是否移动设备来访function browserRedirect() { var sUserAgent navigator.userAgen…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本(5.1.3)、RocketMQ-Dashboard 版本的百度网盘链接: 链接:https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码:1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Qt项目报错:Cannot run compiler ‘clang++‘. /bin/sh: 1: clang++: not found

在一台旧电脑上装了深度系统,装了Qt,导入项目, build提示 clang找不到: Project ERROR: Cannot run compiler clang. Output: /bin/sh: 1: clang: not found Maybe you forgot to setup the environment? Error while parsing …

Jenkins+Jmeter集成自动化接口测试并通过邮件发送测试报告

一、Jenkins的配置 1、新增一个自由风格的项目 2、构建->选择Excute Windows batch command(因为我是在本地尝试的,因此选择的windows) 3、输入步骤: 1. 由于不能拥有相同的jtl文件,因此在每次构建前都需要删除jtl…

VS2022远程Linux使用cmake开发c++工程配置方法

文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…

基于Python的高校学生成绩分析系统

随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域,大量基于网络的广泛应用给生活带来了十分的便利。所以把高校成绩分析与现在网络相结合,利用计算机搭建高校成绩分析系统,实现高校成绩分析的信息化。则对于进一步提高…

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新,京东APP内部的Flutter业务也日益增多,Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验,但随之也带来了一些OOM问题,通过线上监控信息…