模版方法模式-定义算法的框架

news2024/11/29 0:35:15

 在生活中,很多事需要通过几个步骤才能完成。例如找工作,一般都包含投递简历、面试、等待结果等几个步骤。投递简历何等待结果这两个步骤大同小异,最大的区别在于面试这个步骤。

在软件开发中,有时也会遇到类似情况。某个方法的实现需要多个步骤(类似找工作),其中有些步骤是固定的(类似投递简历和等待结果),而有些步骤并不固定,存在可变性(类似面试)。而模版方法模式是针对这类情况进行设计,目的是为了提高代码的复用性和系统的灵活性。

1 模版方法模式

定义一个操作中算法的框架,而将一些步骤延迟到子类中,子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

在模版方法模式中,可以将相同的代码放在父类中(例如投递简历和等待结果),而对于基本方法(面试),在父类中只做一个声明,将其具体实现放在不同的子类中。

图 模版方法UML

AbstractClass: 抽象类,定义了一系列基本操作,这些操作可以是具体的,也可以是抽象的。每个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模版方法,用于定义一个算法的框架。模版方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本算法,还可以调用其他对象的方法。

ConcreteClass:是抽象类的子类,用于实现在父类中声明的抽象基本操作,也可以覆盖在父类中已实现的基本操作。

public abstract class JobSearchAbstract {

    public boolean isForJava() { // 钩子函数
        return false;
    }

    final public void searchJob() { // 模版方法,确保不会被子类覆盖
        sendResume();
        interview();
        waitForResult();
    }

    public void sendResume() {
        System.out.println("投递简历");
    }

    public abstract void interview();

    public void waitForResult() {
        if (isForJava()) {
            System.out.println("面试通过!");
        } else {
            System.out.println("面试不通过");
        }
    }
}

public class ProgrammerJobSearch extends JobSearchAbstract{

    @Override
    public void interview() {
        System.out.println("5年工作经验");
    }

    @Override
    public boolean isForJava() {
        return true;
    }

    public static void main(String[] args) {
        JobSearchAbstract jobSearch = new ProgrammerJobSearch();
        jobSearch.searchJob();
    }
}

//投递简历
//5年工作经验
//面试通过!

2 优缺点

优点:

1)在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。

2)提供了代码复用性,提取类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为。

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

4)可以通过子类来覆盖父类的基本方法,不同的子类可以通过基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

缺点:

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

3 适用场景

1)对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模版方法和父类具体方法,而一些可以改变的细节由其子类来实现。即一次性地实现一个算法的不变部分,并将可变的行为留给子类来实现。

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

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

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

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

相关文章

.mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 随着网络犯罪日益猖狂,勒索病毒已经成为数字时代中的一大威胁。.mkp勒索病毒是其中一种,其已经衍生出了多个不同的变种,其中常见的有.[MyFilewaifu.club].mkp勒索病毒,[hendersoncock.li].mkp勒索病毒,[myersairmail.cc].mk…

炸了!CVPR 2024投稿ID突破18000

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【计算机视觉和Transformer】交流群 扫码加入CVer知识星球,可以最快学习到最新顶会顶刊上的论文idea和CV从入门到精通资料,以及最前沿项目和应用&…

【黑马程序员】Maven 进阶

文章目录 前言一、分模块开发与设计1. 分模块开发意义2. 分模块开发(模块拆分)2.1 创建 Maven 模块2.2 书写模块代码2.3 通过 Maven 指令安装模块到本地仓库(install 指令) 二、依赖管理1. 依赖传递1.1 依赖传递冲突问题 2. 可选依…

RMI初探

接口 import java.rmi.Remote; import java.rmi.RemoteException;public interface IFoo extends Remote {String say(String name) throws RemoteException; }import java.rmi.Remote; import java.rmi.RemoteException;public interface IBar extends Remote {String buy(Str…

【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器

问题描述 很简单,就是我电脑强制重启之后用vscode再去连服务器,发现连不上了 解决办法 如上图,点击重试按钮,下面的这些东西就可以复制粘贴了 ctrf查找commit,这个时候就能找到一串d037ac076cee195194f93ce6fe2bdfe296…

leetcode:387. 字符串中的第一个唯一字符

一、题目 函数原型 int firstUniqChar(char* s) 二、算法 设置一个大小为26的字符数组,位置0 - 25 分别对应字符 a - z 。遍历两次字符串,第一次记录下每个字符出现的次数,第二次检查哪个字符最先遍历到且出现次数为1,返回该字符即…

【CIO人物展】黄淮学院副CIO周鹏:构建数智化平台赋能学校高质量发展

周鹏 本文由黄淮学院副CIO周鹏投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业—锐捷网络 大数据产业创新服务媒体 ——聚焦数据 改变商业 黄淮学院是2004年经教育部批准成立的一所省属全日制普通本科高校。学校位于素有“豫州之腹地、天下之最中”之美…

【每日一题】数组中两个数的最大异或值

文章目录 Tag题目来源题目解读解题思路方法一:哈希集合 其他语言python3 写在最后 Tag 【哈希集合】【位运算-异或和】【数组】【2023-11-04】 题目来源 421. 数组中两个数的最大异或值 题目解读 找出数组中两个数的最大异或结果。 解题思路 一看数据量达到了 …

【leetcode】88. 合并两个有序数组(图解)

目录 1. 思路(图解)2. 代码 题目链接:leetcode 88. 合并两个有序数组 题目描述: 1. 思路(图解) 思路一:(不满足题目要求) 1. 创建一个大小为nums1和nums2长度之和的…

做读书笔记时的一个高效小技巧

你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 在这里,我会持续和大家分享好书、好工具和高效生活、工作技巧,欢迎大家一起提升认知…

emoji对齐 特殊字符对齐 文本对齐

emoji如何对齐 特殊字符如何对齐 高级文本对齐 问题引出 我们在程序打印输出时,如何我们所输出的字符中包含emoji文本,或者其它特殊的字符文本,则我们的打印对齐效果将出现错位。以下代码复现了这一效果(tips: 马老师…

“第六十天”

SRAM和DRAM: DRAM:动态RAM(随机存期存储器),是使用栅极电容存储信息的; SRAM:静态RAM,是使用双稳态触发器存储信息的。 重点在于DRAM由于要通过电容放电来表示信息,所…

R语言gplots包的颜色索引表--全平台可用

R语言gplots包的颜色索引表–全平台可用

【Liunx系统编程】命令模式3

目录 一,zip/unzip压缩指令 二,tar打包/压缩/解包指令 三,uname获取系统信息指令 四,Liunx下常用且重要的按键和关机指令 五,文件之间的互传 1,Windows与Linux之间的互传 2,Linux系统之间…

初识JVM

1. JVM内存区域划分 jvm在启动的时候,会申请到一整个很大的内存区域。整个一大块区域,不太好用。为了更方便使用,把整个区域隔成了很多区域,每个区域都有不同的作用。 本地方法栈 此处提到的栈和数据结构中的栈不是一个东西&…

STM32F103C8T6第二天:按键点灯轮询法和中断法、RCC、电动车报警器(振动传感器、继电器、喇叭、433M无线接收发射模块)

1. 点亮LED灯详解(307.11) 标号一样的导线在物理上是连接在一起的。 将 PB8 或 PB9 拉低,就可以实现将对应的 LED 灯点亮。常用的GPIO HAL库函数: void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);//I/…

DeepSORT多目标跟踪——算法流程与源码解析

一、目标检测与目标追踪 1. 目标检测 在目标检测任务中,主要目标是识别图像或视频帧中存在的物体的位置和类别信息。这意味着目标检测算法需要定位物体的边界框(Bounding Box)并确定每个边界框内的物体属于哪个类别(如人、汽车、…

SpringBoot-WebSocket浏览器-服务器双向通信

文章目录 WebSocket 介绍入门案例 WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视…

基于 LangChain 构建 LLM 应用程序设计与实践

▼最近直播超级多,预约保你有收获 近期直播:《基 LangChain大模型架构案例实践》 —1— LangChain 是什么? LangChain 和 Semantic Kernel 是当前比较受欢迎的两款 LLM 应用开发框架。 LangChain 作为一个大语言模型应用开发框架,…

C++ 多态 纯干货讲解 复制可调试(1)

💯 博客内容:多态 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSD…