模板方法模式定义
模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。
从模型图来看,模板方法模式很简单,但是很常用。抽象模板(AbstractClass)中的方法基本分两类:
-
基本方法:子类去实现的方法 ,并且在模板方法中被调用。
-
模板方法:把基本操作方法组合在一起形成一个总算法或一个总行为的方法;一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
而具体模板(ConcreteClass)主要是实现父类定义的抽象的基本方法。
模板方法模式实例+扩展
例子:给两种手机做测试的,测试包括“开机,检查,关机”三种操作。下面用具体的代码来说明:
1.抽象类
public abstract class TestModel {
//开机
protected abstract void open();
//检查
protected abstract void check();
//关闭
protected abstract void close();
//模板方法-测试
public void test(){
this.open();;
this.check();
this.close();
}
}
2.两个实现类Phone1,Phone2
public class Phone1 extends TestModel {
@Override
protected void open() {
System.out.println("phone1的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone1的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone1的关机逻辑");
}
}
public class Phone2 extends TestModel {
@Override
protected void open() {
System.out.println("phone2的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone2的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone2的关机逻辑");
}
}
3.调用
TestModel testModel1=new Phone1();
TestModel testModel2=new Phone2();
testModel1.test();
testModel2.test();
运行的结果如下:
二.扩展
如果phone1在测试中需要关机,而phone2不需要关机,这时需要一个钩子方法。
1.抽象类
public abstract class TestModel {
//开机
protected abstract void open();
//检查
protected abstract void check();
//关闭
protected abstract void close();
//模板方法-测试
public void test(){
this.open();;
this.check();
if (isClose()){
this.close();
}
}
//钩子方法,默认是关机
protected boolean isClose(){
return true;
}
}
2.实现类
public class Phone1 extends TestModel {
public boolean isClose=true;
public void setIsClose(boolean isClose){
this.isClose=isClose;
}
protected boolean isClose(){
return this.isClose;
}
@Override
protected void open() {
System.out.println("phone1的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone1的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone1的关机逻辑");
}
}
public class Phone2 extends TestModel {
@Override
protected void open() {
System.out.println("phone2的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone2的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone2的关机逻辑");
}
//因为是取消关机,所以直接返回false就可以了
protected boolean isClose(){
return false;
}
}
3.调用
Phone1 testModel1=new Phone1();
Phone2 testModel2=new Phone2();
//phone1
testModel1.setIsClose(true);
testModel1.test();
//phone2
testModel2.test()
模板方法模式的优缺点及应用
1.优点
-
封装不变部分,扩展可变的部分。
-
提取了公共的代码,减少代码量,方便维护。
-
父类控制方法,子类去实现。
2.缺点
-
代码的阅读难度会增加,尤其是新手。我们习惯认为抽象类申明的是最抽象的、最一般的事物属性和方法,实现类完成具体的事物属性和方法;而在模板方法模式中,抽象类中定义了部分抽象方法,而子类实现父类后执行的结果影响了父类,子类对父类产生了影响。
3.应用
-
重构
-
规定算法
-
抽取公共的逻辑
参考资料《大话设计模式》《设计模式之禅》
推荐阅读
相关推荐
基于spring boot框架药品购买系统_a7imn57w.zip
"基于滑模磁链的改进无位置控制技术:减小转矩脉动与抖振,降低电流THD并优化参数依赖",结合滑模和磁链的改进滑模磁链无位置控制,相比于传统的滑模观测器,能有效减小转矩脉动和抖振现象,降低电流THD。 传统的磁链观测器对电气参数非常敏感,改进的磁链观测器将滑模控制率和磁链观测器结合,有效降低了对参数的依赖。 该模型针对特定的小电感电阻电机进行了验证。 ,核心关键词:滑模磁链无位置控制;改进滑模;磁链观测器;传统滑模观测器;电气参数依赖;电流THD;小电感电阻电机验证,好的,根据您提供的关键信息,提炼的标题如下: "结合滑模与磁链技术的改进型无位置控制策略,有效减小抖振与电流THD" 此标题直接体现了该策略结合了滑模和磁链技术,并有效减小了转矩脉动、抖振现象以及电流THD。希望符合您的要求。
红外轮廓提取python代码
# 基于Raspberry Pi 3b的STM原子力显微镜控制系统 ## 项目简介 本项目是一个基于Raspberry Pi 3b的STM(扫描隧道显微镜)控制系统,旨在实现对原子力显微镜的高精度控制和图像采集。通过结合Arduino Uno和ADS1115、AD5764等硬件设备,项目实现了对显微镜的多种操作模式和图像处理功能。 ## 项目的主要特性和功能 1. 信号采集与控制 使用ADS1115进行z轴信号的采集。 通过Arduino Uno控制AD5764,实现对压电驱动器的精确控制。 2. 图像处理 实现3D图像的采集和处理。 3. 操作模式 支持两种操作模式 1. 恒高模式在扫描过程中保持高度恒定。 2. 恒流模式在扫描过程中保持电流恒定。 4. 粗略定位 使用步进电机进行粗略的初始定位。 ## 安装使用步骤 1. 硬件连接
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
2024免费毕业设计成品,包括源码+数据库+往届论文资料 录屏:https://www.bilibili.com/video/BV15S421o7Do 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
【GO】关于一个分布式事务的中间件,目前通信是走的http协议
【爬虫】(天猫,淘宝,京东)爬虫,根据query词爬取数据(Python+Scrapy+MongoDB)_pgj
基于三菱PLC与组态王技术的鸡舍温湿度智能控制系统在养鸡场的应用与优化——No.909解决方案,No.909 基于三菱PLC和组态王鸡舍温湿度控制养鸡场 ,三菱PLC; 温湿度控制; 鸡舍养鸡场; 组态王控制系统; No.909,基于三菱PLC与组态王技术的鸡舍温湿度控制方案
"三菱PLC与触摸屏联合开发气压传动焊条包装线技术详解",No.945 三菱PLC和触摸屏基于气压传动的焊条包装线的研发 ,核心关键词:三菱PLC; 触摸屏; 气压传动; 焊条包装线; 研发; No.945,"三菱PLC与触摸屏在气压传动焊条包装线研发项目No.945中的应用"
# 基于Spring Boot和Spring Integration的微服务购物系统 ## 项目简介 本项目是一个基于Spring Boot和Spring Integration的微服务购物系统,旨在提供一个高效、可扩展的在线购物平台。系统通过微服务架构实现各个功能模块的解耦,包括商品管理、购物车、订单处理、配送服务等。Spring Integration用于实现服务间的消息传递和集成。 ## 项目的主要特性和功能 1. 商品管理 商品的添加、删除和查询。 从京东网站抓取商品信息。 2. 购物车功能 添加商品到购物车。 从购物车中删除商品。 购物车结账生成订单。 3. 订单处理 订单的创建和状态管理。 订单的供应和结账流程。 4. 配送服务 根据订单生成配送信息。 配送状态的管理和查询。 5. 服务注册与发现
基于Omron PLC与MCGS组态的自动化售货机控制系统研究与应用:No.848 实践探索与效果分析,No.848 基于Omron PLC和MCGS组态机控制 ,基于Omron PLC; MCGS组态; 售货机控制; 848号项目,基于Omron PLC与MCGS组态的售货机控制系统研究No.848
参考链接:https://www.bilibili.com/video/BV1ZYNHetEaY/?vd_source=bf2d43514ea61b1121399ab65421e37c 前端:Vue 后端:SpringBoot 数据库:MySQL 有数据库文件,项目完整 1、登录模块 可以登录成功和退出登录。 2、用户管理模块 可以添加、删除、修改、查询用户信息。 3、部门管理模块 可以添加、删除、修改、查询部门信息。 4、出勤管理模块 可以查询和编辑出勤信息。 5、工资管理模块 可以查询和编辑工资信息。 6、奖惩管理模块 可以添加、删除、修改、查询奖惩信息。 7、员工管理模块 可以添加、删除、修改、查询员工信息。
昇腾硬件上面向算子开发场景的编程语言Ascend C的高阶类库ascendc-api-adv-master.zip
"中央空调时间控制启停的优化:西门子1200PLC与TP900触摸屏模拟仿真程序在博途V16环境下的应用与探讨",中央空调改时间控制启停西门子1200PLC和TP900触摸屏模拟仿真程序博途V16 ,中央空调; 时间控制启停; 西门子1200PLC; TP900触摸屏; 模拟仿真程序; 博途V16,"中央空调的定时启停:Siemens 1200PLC与TP900触摸屏模拟仿真程序V16"
内容概要:这份PDF文档系统梳理了Java多线程的核心概念和技术,涵盖了基础知识、锁机制、线程池以及典型应用场景等关键主题。主要内容包括:多线程的基础知识点(并行与并发区分、线程和进程差异及其创建方式)、创建和使用线程的多种方式及其实现;详细讨论了几种常用的并发锁机制(synchronized、AQS、ReentrantLock等);深入介绍了不同类型的线程池及其配置参数的选择依据;探讨了常见的线程控制工具(如Semaphore和CountDownLatch);并讲解了一些高级话题(例如死锁检测与预防、ThreadLocal的作用)及相关的真实面试情景还原。 适用人群:对于具有一定Java编程经验、希望进一步掌握或复习多线程编程技巧的人士而言是非常有用的资料。特别适用于准备求职面试的技术人员。 使用场景及目标:该资料可以帮助开发者理解并发编程的基本原理,熟练运用各类同步原语和容器以构建高效的并发应用程序;此外,文中提供的面试指南有助于应聘者针对可能出现的技术难题做好充分准备。 其他说明:尽管本资料详尽地阐述了许多理论知识,但在实践中还需结合实际情况做出合理的优化决策。 适合人群:具有一定Java基础并且对多线程感兴趣的开发人员,尤其是那些想要深入了解多线程机制并对自己的职业发展有所规划的人。 使用场景及目标:帮助程序员加深对Java多线程编程技术的认知,提升应对复杂任务的能力;同时也是备战工作中可能遇到的各种多线程面试考题的有效参考资料。 阅读建议:此资源适合循序渐进地学习,先从简单的概念入手逐步过渡到较为复杂的主题,对于关键技术和实用的例子可以适当做一些练习加深理解和记忆。
# 基于ASP.NET Core和Dapr的掩码文本项管理系统 ## 项目简介 本项目是一个基于ASP.NET Core和Dapr的掩码文本项管理系统,旨在提供一个高效、安全的文本管理解决方案。通过使用Dapr框架,项目能够轻松实现微服务架构,并提供诸如状态管理、消息传递等功能。ASP.NET Core则提供了强大的Web应用开发能力,确保系统的高性能和可扩展性。 ## 项目的主要特性和功能 ### 1. 文本项管理 创建掩码文本项支持创建带有掩码的文本项,确保敏感信息的安全性。 更新掩码文本项允许用户更新已有的掩码文本项,保持数据的实时性和准确性。 获取掩码文本项提供根据ID获取特定掩码文本项的功能。 获取多个掩码文本项支持批量获取多个掩码文本项,方便用户进行数据分析和处理。 删除掩码文本项允许用户删除不再需要的掩码文本项,确保数据管理的整洁性。 ### 2. 集成事件处理
C Java的作业拼图游戏.zip
基于三菱PLC与组态王技术的七层电梯控制系统No.803:智能化控制策略与实践,No.803 基于三菱PLC和组态王7层电梯七层电梯控制 ,三菱PLC; 组态王; 七层电梯控制; 803编号,"三菱PLC与组态王协同控制的七层电梯系统"
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea