持续总结中!2024年面试必问 20 道设计模式面试题(七)

上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(六)-CSDN博客

十三、状态模式(State Pattern)和策略模式(Strategy Pattern)有何区别?

状态模式(State Pattern)和策略模式(Strategy Pattern)都是行为型设计模式,它们提供了不同的方法来处理对象的行为变化。以下是两种模式的主要区别:

状态模式(State Pattern):

状态模式允许一个对象在其内部状态改变时改变它的行为,看起来好像改变了其类。它主要用于实现状态机,即行为随状态改变而变化的场景。

特点:

  • 状态模式关注对象的状态以及状态之间的转换。
  • 状态模式通常用于封装复杂的条件语句(如基于状态的 if-else 或 switch-case 语句)。

组成部分:

  • 状态接口(State):定义了所有具体状态共有的行为。
  • 具体状态(Concrete State):实现状态接口,定义具体的状态行为和状态转换逻辑。
  • 上下文(Context):维护当前状态,并提供给客户端使用。

使用场景:

  • 当一个对象的行为依赖于它的状态,并且状态在运行时会改变时。

策略模式(Strategy Pattern):

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换,算法的变化不会影响到使用算法的客户。

特点:

  • 策略模式关注算法或行为的家族,以及它们之间的互换性。
  • 策略模式通常用于替代复杂的条件语句,通过定义一系列的策略来实现行为的变化。

组成部分:

  • 策略接口(Strategy):定义了所有策略共有的接口。
  • 具体策略(Concrete Strategy):实现策略接口,定义具体的算法或行为。
  • 上下文(Context):配置一个策略对象,通过这个策略对象来执行算法。

使用场景:

  • 当需要在运行时选择使用不同的算法或行为时。

状态模式与策略模式的区别:

  1. 关注点不同

    • 状态模式关注的是对象的状态以及状态之间的转换。
    • 策略模式关注的是算法或行为的家族,以及它们之间的互换性。
  2. 使用目的不同

    • 状态模式用于根据对象的状态来改变行为,实现状态机。
    • 策略模式用于在运行时根据不同的策略来改变行为,实现算法的动态选择。
  3. 状态与策略的区别

    • 状态通常与对象的属性或环境有关,而策略通常与解决问题的方法有关。
  4. 上下文的不同

    • 在状态模式中,上下文维护一个状态对象,该状态对象决定了对象的行为。
    • 在策略模式中,上下文维护一个策略对象,该策略对象定义了对象的行为。
  5. 变化频率不同

    • 状态模式中的状态转换通常是由于对象的属性或环境发生变化。
    • 策略模式中的策略变化通常是由于外部条件或用户选择。
  6. 实现方式不同

    • 状态模式通常通过状态对象来封装状态转换逻辑。
    • 策略模式通常通过策略对象来封装算法或行为。
  7. 可扩展性不同

    • 状态模式在添加新状态时可能需要修改上下文类,因为状态转换逻辑可能依赖于上下文。
    • 策略模式在添加新策略时不需要修改上下文类,因为策略是独立的,上下文只是使用策略。

总结来说,状态模式和策略模式虽然都可以改变对象的行为,但它们的关注点、使用目的、实现方式和可扩展性都有所不同。状态模式适用于行为随状态变化的场景,而策略模式适用于需要在运行时动态选择算法或行为的场景。

十四、请描述备忘录模式(Memento Pattern)及其使用场景。

备忘录模式(Memento Pattern),也称为备忘录对象模式,是一种行为设计模式,用于在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便之后可以恢复该状态。

备忘录模式的组成部分:

  1. 发起人(Originator):负责创建一个备忘录,用以记录当前对象的状态,并且可以恢复到先前的状态。
  2. 备忘录(Memento):存储发起人对象的内部状态,并且可以防止其他对象访问这些状态。
  3. 负责人(Caretaker):负责保存备忘录,但是不能对备忘录内容进行操作或检查。

备忘录模式的工作原理:

  1. 发起人对象在关键的时刻创建一个备忘录对象,将自身的状态存储在其中。
  2. 发起人对象可以继续变化,备忘录对象保存了创建时刻的状态。
  3. 当需要恢复到之前的状态时,发起人对象可以从备忘录对象中读取之前的状态信息,恢复到那个状态。

备忘录模式如何使用:

  • 创建备忘录:发起人对象在关键状态时创建一个备忘录。
  • 保存备忘录:负责人对象保存这个备忘录,可能将其存储在列表或其他结构中。
  • 恢复状态:当需要回退到之前的状态时,发起人对象从负责人那里获取备忘录,并恢复其状态。

使用场景:

备忘录模式特别适用于以下情况:

  • 当需要提供一个可以恢复到之前状态的功能,比如“撤销”操作。
  • 当不希望外界直接获取对象的内部状态,同时又需要保存对象的状态时。
  • 当对象的当前状态占用大量资源,而通过备忘录可以减少资源消耗时。

代码示例(伪代码):

// 备忘录接口
class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// 发起人
class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();}
}// 负责人
class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void addMemento(Memento memento) {mementoList.add(memento);}public Memento getMemento(int index) {return mementoList.get(index);}
}// 客户端代码
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();originator.setState("State 1");
caretaker.addMemento(originator.saveStateToMemento());originator.setState("State 2");
// ... 其他操作 ...// 撤销到之前的状态
originator.getStateFromMemento(caretaker.getMemento(0));
// originator 的状态现在是 "State 1"

在这个示例中,Originator 类负责创建备忘录,并可以保存和恢复状态。Memento 类负责存储状态信息。Caretaker 类负责保存备忘录对象,可以管理多个备忘录,例如实现撤销栈。客户端代码通过使用这些类来实现状态的保存和恢复。通过这种方式,备忘录模式提供了一种在不破坏封装性的情况下保存和恢复对象状态的方法。

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

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

相关文章

CentOS 8.5 - 配置ssh的免密登录

文章目录 生成ssh密钥公钥内容放入服务器 生成ssh密钥 在本地主机安装 ssh工具&#xff0c;并生成公钥、私钥。 # 命令行输入 ssh-keygen -r rsa# 会在当前用户的家目录下生成一个.ssh目录公钥内容放入服务器 将上一步生成的id_rsa.pub公钥的内容复制到远程服务器 # 编辑文…

虚拟机安装JDK11操作教程

1、新建/usr/java目录 mkdir /usr/java 2、将jdk-11文件上传/usr/java目录 3、解压jdk-11文件 tar -zxvf jdk-11_linux-x64_bin.tar.gz 4、编辑配置文件&#xff0c;配置环境变量 vi /etc/profile 在打开的文件末尾添加 export JAVA_HOME/usr/java/jdk-11 export JRE_HOM…

【java 线程的状态】

介绍 Java 线程在运⾏的⽣命周期中的指定时刻只可能处于下⾯ 6 种不同状态的其中⼀个状态 状态名称说明NEW初始状态,线程被构建,但是还没有调用start()方法RUNNABLE运行状态,Java线程将操作系统中的就绪和运行两种状态统称为"运行中"BLOCKED阻塞状态,表示线程阻塞于…

对30年国债利率破2.5%的复盘反思

短期看&#xff0c;以月为维度&#xff0c;长端和超长端利率依然具有较强的向下突破的惯性&#xff1b;中期看&#xff0c;以季为维度&#xff0c;长端依然面临向下赔率不足的约束&#xff0c;但调整需要多重利空共振的契机。 短期看多&#xff0c;逢高配置”的四点逻辑 逻辑一…

linux——ansible实验

要求 0.进入servera进行准备工作&#xff0c;做一些清理 1&#xff09;停止httpd服务&#xff0c;清除httpd软件包、配置文件、主页文件 2&#xff09;清理/etc/hosts文件中的内容&#xff0c;只保留最上面默认的两行 &#xff08;127.0.0.1和::1这两行&#xff09; 1.根据之前…

brew 安装多个版本的php

在使用Homebrew安装多个版本的PHP时&#xff0c;可以通过以下步骤进行&#xff1a; 搜索可用的PHP版本&#xff1a; brew search php 安装特定版本的PHP&#xff08;以PHP 7.4为例&#xff09;&#xff1a; brew install php7.4 如果需要&#xff0c;安装其他版本&#xf…

短信内容关键字被拦截-阿里云通知类短信

通知类短信。地产、留学、招聘、交友、游戏等行业仅支持发送验证码。 注意不要有字眼&#xff0c;替换为相似的词语。否则拦截率很高

如何设计一个点赞系统

首先我们定义出一个点赞系统需要对外提供哪些接口&#xff1a; 1.用户对特定的消息进行点赞&#xff1b; 2.用户查看自己发布的某条消息点赞数量以及被哪些人赞过&#xff1b; 3.用户查看自己给哪些消息点赞过&#xff1b; 这里假设每条消息都有一个message_id, 每一个用户都…

百度安全X盈科全球数据合规服务中心:推进数据安全及合规智能化创新领域深化合作

6月19日&#xff0c;百度安全与盈科全球数据合规服务中心举行合作签约仪式&#xff0c;双方将充分发挥各自优势&#xff0c;在数据安全及合规智能化创新领域深化合作&#xff0c;在遵守国家法律法规和顺应市场规则的前提下&#xff0c;推动地方经济社会发展&#xff0c;促进企业…

(3) cmake编译多个cpp文件

文章目录 概要整体代码运行结果 概要 上一节中实现了对单个cpp文件用cmake编译。这一节升级一下 整体代码 main.cpp #include <iostream> #include "person.h"using namespace std;int main() {person me person("langdaoliu", 28, "engin…

2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改

JDBC案例 将来如果完成的话 就代表对JDBC里面的知识点全部融会贯通了 其实就是对数据的增删改查 我们入门做不出来前端的内容 很正常 准备环境 建表 use mybatis;create table tbl_brand (id int primary key auto_increment,brand_name varchar(20),company_name varcha…

【Android面试八股文】你在多渠道打包方面提到了使用美团的Walle框架,那你能说一说Walle的原理吗?

文章目录 一、你说你做了多渠道打包的优化,你是怎么做的?二、能详细说明你是如何利用Walle框架进行多渠道打包优化的吗?2.1. 引入Walle框架:2.2. 配置Walle插件:2.3. 生成渠道文件:2.4. 打包与写入渠道信息:2.4.1 如何生成渠道包2.4.2 临时生成某渠道包2.5. 插入额外信息…

使用 ZoomEye 找到未启用身份验证的 Jupyter 服务器

一&#xff0e;摘要 在使用Jupyter Notebook和JupyterLab 的过程中&#xff0c;有些用户缺乏安全意识&#xff0c;未启用身份验证功能&#xff0c;导致任何用户都可以直接访问自己的Jupyter服务器&#xff0c;并查看其服务器上的代码和文档。 我们使用ZoomEye 网络空间搜索引…

SBTI认证的申请流程是什么?

SBTI&#xff08;科学基准目标倡议&#xff09;认证的申请流程通常包括以下几个关键步骤&#xff0c;以下是根据参考文章整理出的清晰流程&#xff1a; 咨询和准备阶段&#xff1a; 企业首先需要咨询SBTI认证机构&#xff0c;了解认证的标准和要求&#xff0c;并确定是否有资格…

浏览器支持http-flv协议

Google Chrome 浏览器和Microsoft Edge 浏览器原生并不支持 HTTP-FLV 协议。HTTP-FLV 主要与 Flash Player 相关&#xff0c;而 Flash Player 已经在 2020 年底停止支持&#xff0c;并且 Microsoft Edge 也逐步淘汰了对 Flash 的支持。 flv.js 利用 HTML5 和 Media Source Exte…

Windows使用小技巧

以下给大家分享了一些电脑使用小技巧&#xff0c;赶快点赞、收藏、分享&#xff01; 分屏操作&#xff1a;按住Win键&#xff0c;配合左右方向键可以实现分屏操作&#xff0c;适合一边办公一边娱乐的需求。快速打开任务管理器&#xff1a;按住CtrlShiftEsc可以快速打开任务管理…

如何找到和解决SAP ABAP程序中的性能问题

找到和解决SAP ABAP程序中的性能问题需要通过一系列的步骤和工具进行。 确定问题来源&#xff1a;首先&#xff0c;你需要确定性能问题是由数据库请求还是ABAP代码执行引起的。你可以通过查看系统统计数据&#xff08;使用事务STAT/STAD&#xff09;或者使用进程概览工具&#…

LDO的原理及测试方法

一、基本结构 这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。 LDO拓扑结构图 常见的基本结构 利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS…

leetcode45 跳跃游戏II

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1]…

pywinauto exists 方法

在 pywinauto 库中&#xff0c;exists 方法通常与窗口&#xff08;Window 类&#xff09;或控件对象相关联&#xff0c;用于检查该对象是否存在。这个方法对于确保你的自动化脚本在对象存在时才进行操作非常有用&#xff0c;可以避免因尝试访问不存在的元素而导致的错误。 方法…