当前位置: 首页 > news >正文

赶紧收藏!2024 年最常见 20道设计模式面试题(八)

上一篇地址:赶紧收藏!2024 年最常见 20道设计模式面试题(七)-CSDN博客

十五、模板方法模式是如何在父类中定义算法框架的?

模板方法模式通过在父类(通常是一个抽象类)中定义算法的骨架,同时允许子类实现或扩展某些步骤,来实现算法框架的定义。这种模式使得算法的结构保持不变,而某些特定步骤的行为可以被定制。以下是模板方法模式在父类中定义算法框架的详细步骤:

  1. 定义模板方法

    • 模板方法是在父类中定义的一个抽象方法,它规定了算法的总体流程。这个方法通常是一个最终方法(final),以确保子类不能改变算法的结构。
  2. 调用基本方法

    • 在模板方法中,父类调用一个或多个基本方法来实现算法的特定步骤。这些基本方法可以是抽象的,也可以是具体的。
  3. 定义钩子方法(可选):

    • 钩子方法是在父类中定义的,可以被子类覆盖的方法。它们通常在模板方法中被调用,允许子类在算法的执行过程中插入自己的行为。
  4. 实现或扩展基本方法

    • 父类可以提供一些基本方法的默认实现,这些方法可以被子类重写以提供特定的行为。
  5. 抽象方法

    • 对于那些需要由子类实现的步骤,父类中定义为抽象方法,子类必须提供这些方法的具体实现。
  6. 确保算法的一致性

    • 父类通过模板方法控制算法的执行流程,确保算法的一致性,即使子类改变了某些步骤的行为。

代码示例(伪代码):

// 抽象类,定义算法框架
abstract class Game {// 模板方法,定义算法骨架public final void play() {initialize();startPlay();endPlay();}// 抽象方法,由子类实现protected abstract void initialize();// 钩子方法,可以被子类覆盖protected void startPlay() {// 默认行为}// 钩子方法,可以被子类覆盖protected void endPlay() {// 默认行为}
}// 具体类:实现算法的特定步骤
class SoccerGame extends Game {@Overrideprotected void initialize() {// 足球游戏的初始化}@Overrideprotected void startPlay() {// 足球游戏的开始逻辑}@Overrideprotected void endPlay() {// 足球游戏的结束逻辑}
}// 客户端代码
Game game = new SoccerGame();
game.play(); // 执行足球游戏的算法流程

在这个示例中,Game 类是一个抽象类,它定义了 play 方法作为模板方法,该方法调用了 initializestartPlay 和 endPlay 这三个基本方法,构成了一个游戏的算法框架。SoccerGame 类继承自 Game 类,并提供了 initializestartPlay 和 endPlay 方法的具体实现,从而定制了足球游戏的算法步骤。通过这种方式,模板方法模式确保了算法的一致性,同时允许子类定制特定的行为。

十六、命令模式如何实现请求的封装和解耦?

命令模式(Command Pattern)是一种行为设计模式,它将一个请求或操作封装为一个对象。这种模式允许用户使用不同的请求、队列或日志请求来参数化其他对象,同时支持可撤销的操作。命令模式通过以下方式实现请求的封装和解耦:

命令模式的组成部分:

  1. 命令接口(Command):定义了执行操作的接口。
  2. 具体命令(Concrete Command):实现命令接口,对应于具体请求或操作。
  3. 调用者(Invoker):要求该命令执行这个请求。
  4. 接收者(Receiver):知道如何实施与执行一个请求相关的操作。

命令模式如何实现请求的封装:

  1. 封装请求:命令接口定义了执行操作的方法,具体命令类实现这个接口,将请求封装为一个对象。这意味着请求的详细信息和执行逻辑都被包含在具体命令对象中。

  2. 参数化调用者:调用者通过命令对象来执行请求,而不是直接调用接收者的方法。这样,调用者不需要知道接收者的具体实现,只需要知道命令对象。

  3. 使用命令队列:命令对象可以被存储在队列中,允许系统在不同时间执行请求,实现请求的排队和调度。

命令模式如何实现请求的解耦:

  1. 解耦调用者和接收者:调用者通过命令对象来间接调用接收者的方法,不需要直接与接收者交互。这样,调用者和接收者之间的耦合度降低。

  2. 扩展性:当需要添加新的请求类型时,只需添加一个新的具体命令类,而不需要修改现有的调用者或接收者类。这符合开闭原则(对扩展开放,对修改封闭)。

  3. 撤销操作:命令模式可以很容易地实现撤销操作。通过维护一个命令的历史列表,可以创建一个撤销命令来撤销之前执行的命令。

  4. 日志记录:命令对象可以被用来记录请求的日志,便于后续的审计或调试。

代码示例(伪代码):

// 命令接口
interface Command {void execute();
}// 接收者
class Receiver {public void action() {// 接收者执行的操作}
}// 具体命令
class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.action();}
}// 调用者
class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void trigger() {command.execute();}
}// 客户端代码
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();invoker.setCommand(command);
invoker.trigger(); // 执行请求

在这个示例中,ConcreteCommand 类是一个具体命令,它封装了对 Receiver 类的 action 方法的调用。Invoker 类作为调用者,通过 setCommand 方法设置要执行的命令,并通过 trigger 方法执行这个命令。这样,调用者和接收者之间的耦合被命令对象解耦,同时请求被封装在命令对象中,可以灵活地进行操作,如排队、撤销等。

相关文章:

赶紧收藏!2024 年最常见 20道设计模式面试题(八)

上一篇地址:赶紧收藏!2024 年最常见 20道设计模式面试题(七)-CSDN博客 十五、模板方法模式是如何在父类中定义算法框架的? 模板方法模式通过在父类(通常是一个抽象类)中定义算法的骨架&#x…...

JAVA学习-练习试用Java实现“比较版本号”

问题: 给定两个版本号 version1 和 version2 ,请比较它们。 版本号由一个或多个修订号组成,各修订号由一个 . 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,…...

云原生分级SLA

云原生分级SLA(Service Level Agreement,服务等级协议)规则是为了确保云服务提供商和客户之间对服务性能、可用性和其他关键指标有明确的理解和期望。这些规则通常基于业务需求和技术实现来制定,并根据服务的不同级别进行分级。以…...

java干货 线程间通信

文章目录 一、线程间通信1.1 为什么要处理线程间通信?1.2 什么是等待唤醒机制? 二、等待唤醒机制使用2.1 等待唤醒机制用到的方法2.1.1 wait2.1.2 notify 2.2 线程通信代码实践2.2.1 重要说明2.2.2 代码 一、线程间通信 1.1 为什么要处理线程间通信&…...

【人机交互 复习】第6章 交互式系统的设计

一、设计框架 1.在建立了一组需求之后,设计即将开始,建议采取自上面下的方式,首先把重点放在大的方面,生成低保真且不包含具体细节的方案,一般通过写剧本来确定交互设计模式与逻辑。 2.设计框架: 先站在一个…...

1-函数极限与连续

1 2 平方项没有考虑到(其正负)...

【C++题解】1670 - 象棋大赛

问题:1670 - 象棋大赛 类型:分支问题 题目描述: 市里要组织象棋大赛,年龄在 8∼30 周岁之间的选手可以报名参赛。为了公平起见,大赛组委会将选手们分了青年组、少年组和儿童组,大赛组委会规定&#xff1a…...

Samba:用于高效无限上下文语言建模的简单混合状态空间模型

Samba: Simple Hybrid State Space Models for Efficient Unlimited Context Language Modeling 📜 文献卡 Samba: Simple Hybrid State Space Models for Efficient Unlimited Context Language Modeling作者: Liliang Ren; Yang Liu; Yadong Lu; Yelong Shen; …...

通俗易懂的ChatGPT原理简介

一、引言 随着人工智能的发展,聊天机器人已经成为我们生活中的常见工具。而在众多聊天机器人中,ChatGPT 无疑是最受关注的一个。ChatGPT 是由 OpenAI 开发的一种基于生成式预训练模型(GPT)的大型语言模型。本文将通俗易懂地介绍 …...

你认为 AI 作图程序「MidJourney」有哪些比较好用的关键词?

玩了一段时间的MidJourney,打算把这个回答做成资源帖。也欢迎在评论区补充讨论。 MidJourney的极简指南 快速上手 装discord,或者直接打开网址 https://discord.gg/midjourney 注册用户。进入Midjourney的官方服务器后,在左侧栏找一个newb…...

9.2JavaEE——JDBCTemplate的常用方法(一)excute()方法

execute()方法用于执行SQL语句,其语法格式如下: jdTemplate.execute("SQL 语句");下面以创建数据表的SQL语句为例,来演示excute()方法的使用,具体步骤如下。 1、创建数据库 在MySQL中,创建一个名为spring的…...

正向代理和反向代理的区别

正向代理和反向代理的主要区别在于代理服务器所服务的对象不同。 正向代理(Forward Proxy):正向代理的客户端是内部网络的用户。当内部网络的用户想要访问外部网络(例如互联网)时,可以通过正向代理服务器来…...

express入门03增删改查

目录 1 搭建服务器2 静态文件托管3 引入bootstrap4 引入jquery5 编写后端接口5.1 添加列表查询方法5.2 添加路由5.3 添加数据表格 总结 我们前两篇介绍了如何利用express搭建服务器,如何实现静态资源托管。那利用这两篇的知识点,我们就可以实现一个小功能…...

【usb设备端口异常】——使用ls /dev/video*查看设备号时出现报错:ls:无法访问‘/dev/video*‘: 没有那个文件或目录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ls:无法访问/dev/video*: 没有那个文件或目录1. 问题描述2. 原因分析3. 解决方法 总结 前言 一、ls:无法访问’/dev/video*: 没有那个文件或目录 使用的这…...

Java实现异步开发的方式

1)、继承 Thread 2)、实现 Runnable 接口 3)、实现 Callable 接口 FutureTask (可以拿到返回结果,可以处理异常) 4)、使用线程池 区别:1、2)不能得到返回值 …...

小知识点快速总结:Batch Normalization Layer(BN层)的作用

本系列文章只做简要总结,不详细说明原理和公式。 目录 1. 参考文章2. 主要作用3. 具体分析3.1 正则化,降低过拟合3.2 提高模型收敛速度,加速训练3.3 减少梯度爆炸或者梯度消失的情况 4. 补充4.1 BN层做的是标准化不是归一化4.2 BN层的公式4.…...

【SpringCloud】负载均衡(Spring Cloud LoadBalancer)

负载均衡 当服务流量增大时,通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。 比…...

三生随记——输入法之谜

在深夜的电脑前,李浩专心致志地敲打着键盘,为他的小说写下最后一章。然而,随着他不断输入文字,他渐渐察觉到一丝不对劲。每次他尝试输入特定的词汇,输入法都会自动跳转到一些与主题毫不相关的句子,甚至有些…...

【名词解释】Unity中的3D物理系统:刚体

Unity中的3D物理系统是用于模拟现实世界中物体的运动和相互作用的一套工具和组件。刚体(Rigidbody)是Unity 3D物理系统中的一个核心组件,它允许游戏对象(GameObject)受到重力和外力的影响,并参与碰撞检测。…...

icon转svg处理

一般情况下,图标我们可以找UI或者去iconfont.cn获得一个svg格式的文件。然后再IDE中以文本的方式打开,然后格式化,就可以看到代码。代码中一般是最外层一个svg标签,里面是一个或者多个path。这个时候,我们使用h方法来实…...

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议(CITCE 2024) 大会官网:www.citce.org 时间地点:2024年11月1-3日,中国-武汉 收录检索:EI Compendex,Scopus 主办单位:四川师范…...

EasyCVR/EasyDSS无人机直播技术助力野生动物监测

近日有新闻报道,一名挖掘机师傅在清理河道时,意外挖出一只稀有的扬子鳄,挖机师傅小心翼翼地将其放在一边,扬子鳄也顺势游回一旁的河道中。 随着人类对自然环境的不断探索和开发,野生动物及其栖息地的保护显得愈发重要。…...

AI视频教程下载-ChatGPT 生产力 + 时间管理

ChatGPT Productivity Time Management. ChatGPT Productivity ChatGPT 显著提升生产力 不寻常的时间管理技巧。ChatGPT 工作,Chat GPT 自动化,ChatGPT 2023! 对关于ChatGPT的讨论感到好奇,想知道如何利用它为自己带来好处吗&a…...

Java 集合框架:LinkedList 的介绍、使用、原理与源码解析

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...

【Ruby爬虫01】某吃瓜网站图片数据采集

介绍 由于最近在学习Ruby,写一个爬虫锻炼一下。涉及xml解析、多线程、xpath语法等基础知识。 实现代码 使用说明 使用前请先安装如下gem gem install nokogiri http openssl# nokogiri:一个解析xml和html的库,支持css、xpath语法 # htt…...

可以免费领取tokens的大模型服务

本文更新时间:2024年6月20日 豆包大模型 “亲爱的客户,模型提供方将在5月15日至8月30日期间,为您提供一次独特的机会,即高达5亿tokens的免费权益。这是我们对您长期支持的感谢,也是对未来合作的期待。” 在8月30日之…...

NSSCTF-Web题目11

目录 [鹤城杯 2021]EasyP 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]numgame 1、题目 2、知识点 3、思路 [鹤城杯 2021]EasyP 1、题目 2、知识点 php代码审计 3、思路 打开题目,出现一段代码,我们对代码进行审计 这里出现了很多不懂的…...

【数据结构】第十八弹---C语言实现堆排序

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、堆排序 1.1、基本思想 1.2、初步代码实现 1.3、代码优化 1.4、代码测试 总结 1、堆排序 在博主数据结构第十二弹---堆的应用有详细讲解堆…...

[面试题]Kafka

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…...

centos7 离线安装zip和unzip

解压的时候发现不能解压,报-bash: unzip: command not found 1、访问https://www.rpmfind.net/linux/rpm2html/search.php?queryzip&submitSearch…&systemcentos&arch#/ 2、输入zip和centos搜索,选择el7下载 3、输入unzip和centos搜索&am…...

南充网站建设价格/搜索引擎营销sem

select * from (select * from NA_USEPERCENTPERDAY t order by t.id) where rownum<8;...

网站维护需要的知识/指数分布

一.设计原则 架构设计我我们平时写代码不一样&#xff0c;两者的差异主要体现在“不确定性”上。对于编程来说&#xff0c;本质上是确定的&#xff0c;对于同样一段代码&#xff0c;不管是谁写的&#xff0c;不管什么时候执行&#xff0c;执行的结果应该都是确定的&#xff1b;…...

前端低代码开发/seo草根博客

面试题目&#xff1a;实现RANSAC的框架 Random Sample Consensus&#xff08;RANSAC&#xff09; 随机抽样一致算法&#xff0c;MRPT写得是比较好的&#xff0c;注意每次此迭代后需要更新迭代次数。见https://github.com/MRPT/mrpt/blob/master/libs/math/src/ransac.cpp&#…...

深圳网站建设找哪/阿里云域名注册

CSharpGL(47)你好&#xff0c;Framebuffer&#xff01; Framebuffer对象(FBO)是一种复杂的OpenGL对象。使用自定义的framebuffer&#xff0c;可以实现离屏渲染&#xff0c;进而实现很多高级功能&#xff0c;例如阴影。 下载 CSharpGL已在GitHub开源&#xff0c;欢迎对OpenGL有兴…...

wordpress输出标签/百度seo快速提升排名

一.问题描述 Java基本数据类型所占字节数以及一个字符串怎么判断有多少个字节&#xff1f; 解答第一个问题&#xff0c;Java基本数据类型所占字节数 一个字符串判断有多少个字节组成&#xff1a; String采用一种更灵活的方式进行存储。在String中&#xff0c;一个英文字符、…...

阿里巴巴网站威海哪里做/湖南网站设计外包哪家好

记录链接。http://hi.baidu.com/xx375转载于:https://blog.51cto.com/xzv587/1361039...