整理好了!2024年最常见 20 道设计模式面试题(五)

上一篇地址:整理好了!2024年最常见 20 道设计模式面试题(四)-CSDN博客

九、什么是命令模式?它如何帮助实现解耦?

命令模式(Command Pattern)是一种行为设计模式,它将一个请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象与执行请求的对象解耦,从而让不同的请求、队列或者日志请求以及操作的撤销等操作能够统一处理。

命令模式的组成部分:

  1. 命令接口(Command Interface):定义了执行命令的方法,所有命令类都必须实现这个接口。
  2. 具体命令(Concrete Command):实现命令接口,对应具体的操作。
  3. 调用者(Invoker):要求命令对象执行请求。
  4. 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
  5. 客户端(Client):创建具体命令对象,并且设置它的接收者。

命令模式如何帮助实现解耦:

  1. 请求者与执行者的解耦:命令模式通过将请求封装为对象,使得请求者和执行者之间没有直接的联系。请求者只需要知道命令接口,而不需要了解具体的命令实现。

  2. 扩展性:当需要添加新的命令时,只需增加一个新的具体命令类,而不需要修改现有的代码。这符合开闭原则(对扩展开放,对修改封闭)。

  3. 参数化方法调用:命令模式允许将方法调用的参数进行参数化,这使得可以在不同的时间、不同的环境中执行相同的请求。

  4. 支持撤销操作:通过维护命令的历史记录,可以实现撤销功能。每个命令对象都可以存储足够的状态信息,以便可以恢复到之前的状态。

  5. 支持日志记录:命令对象可以很容易地被记录到日志中,因为它们是对象,可以被序列化和存储。

  6. 支持事务:如果需要,可以设计命令对象来支持事务性操作,确保操作的原子性。

应用场景:

  • 需要对操作进行排队、记录、撤销或重做的场景,如文本编辑器。
  • 需要支持事务性操作的场景。
  • 需要将操作和调用操作的对象解耦的场景。

示例:

假设有一个简单的文本编辑器,它支持撤销和重做操作。使用命令模式,我们可以定义一个命令接口,比如 EditCommand,然后为每个编辑操作(如插入文本、删除文本)创建具体命令类,如 InsertCommandDeleteCommand。编辑器作为调用者,根据用户的操作来创建相应的命令对象,并执行它们。同时,编辑器可以维护一个命令历史记录,以便实现撤销和重做功能。

通过这种方式,命令模式提供了一种灵活、可扩展的方式来处理请求和操作,同时保持了系统的解耦和模块化。

十、迭代器模式是如何遍历一个集合的元素的?

迭代器模式(Iterator Pattern)是一种行为设计模式,它允许在不暴露其底层表示的情况下,顺序访问一个聚合对象中的各个元素。迭代器模式定义了一种方法来顺序访问一个聚合对象中的所有元素,而不依赖于聚合对象的特定类。

迭代器模式的组成部分:

  1. 迭代器接口(Iterator Interface):定义了迭代器的基本操作,如hasNext()(检查是否有下一个元素)和next()(返回下一个元素)。
  2. 具体迭代器(Concrete Iterator):实现迭代器接口,维护遍历过程中的当前位置。
  3. 聚合接口(Aggregate Interface):定义了创建迭代器的方法,通常是一个createIterator()方法。
  4. 具体聚合(Concrete Aggregate):实现聚合接口,返回一个与该具体聚合相关的迭代器实例。

迭代器模式如何遍历集合元素:

  1. 创建聚合对象:首先,你需要有一个聚合对象,它包含了需要遍历的元素集合。

  2. 创建迭代器对象:通过聚合对象的createIterator()方法,创建一个迭代器对象。

  3. 使用迭代器遍历:使用迭代器对象的hasNext()方法检查是否还有元素可以遍历,如果返回true,则使用next()方法获取下一个元素。

  4. 循环遍历:重复步骤3,直到hasNext()返回false,表示所有元素已经被遍历完毕。

迭代器模式的优点:

  • 抽象性:迭代器模式将集合对象的遍历过程抽象化,使得遍历过程与具体的集合类解耦。
  • 灵活性:可以为不同的集合对象定义不同的迭代器,实现不同的遍历策略。
  • 扩展性:在不修改现有代码的情况下,可以很容易地添加新的迭代器类。
  • 安全:迭代器模式可以保护集合的内部结构,防止外部代码直接访问和修改集合的内部状态。

应用场景:

  • 当需要为一个聚合对象提供多种遍历方式时。
  • 当需要在遍历过程中访问聚合对象的内部状态时。
  • 当需要在遍历过程中修改聚合对象时。

示例:

假设有一个书籍集合,我们想要遍历这个集合,打印每本书的标题。使用迭代器模式,我们可以这样实现:

// 聚合接口
interface BookAggregate {Iterator createIterator();
}// 具体聚合
class BookCollection implements BookAggregate {private List<Book> books;// 创建迭代器public Iterator createIterator() {return new BookIterator(this);}
}// 迭代器接口
interface Iterator {boolean hasNext();Book next();
}// 具体迭代器
class BookIterator implements Iterator {private BookCollection collection;private int currentIndex = 0;public BookIterator(BookCollection collection) {this.collection = collection;}public boolean hasNext() {return currentIndex < collection.books.size();}public Book next() {return collection.books.get(currentIndex++);}
}// 客户端代码
BookCollection collection = new BookCollection();
// 填充集合
Iterator iterator = collection.createIterator();
while (iterator.hasNext()) {Book book = iterator.next();System.out.println(book.getTitle());
}

通过这种方式,迭代器模式提供了一种统一的方法来遍历不同类型的集合,同时保持了代码的灵活性和扩展性。

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

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

相关文章

奇怪的bug

奇怪的bug 合集 1.不可见字符集问题 起因是在自己做小项目的时候&#xff0c;通过lombok的data注解&#xff0c;默认生成实体类的get set方法 但是在某个方法中获取一个属性值的时候显示找不到该属性值的get方法&#xff0c;具体直接贴图 我以为是lombok的配置问题&#xff0c…

ubuntu设置静态ip地址

首先&#xff0c;查看ip地址可以使用&#xff1a; ifconfig 例如&#xff0c;出现如下结果&#xff1a; 然后&#xff0c;需要查看本地的gateway以及dns&#xff0c;可以使用&#xff1a; nmcli device show例如&#xff1a; 接下来说明一下如何设置静态ip&#xff1a;

揭秘后勤报修管理系统:目的明确,功能设计模块助您轻松管理

在数字化、信息化飞速发展的今天&#xff0c;企业后勤报修也迎来了前所未有的变革。传统的报修方式&#xff0c;如电话报修、纸质报修单等&#xff0c;已逐渐无法满足现代企事业单位对高效、便捷、精准报修服务的需求。因此&#xff0c;后勤报修管理系统应运而生&#xff0c;后…

鸣人的影分身(DP)

在火影忍者的世界里&#xff0c;令敌人捉摸不透是非常关键的。 我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。 影分身是由鸣人身体的查克拉能量制造的&#xff0c;使用的查克拉越多&#xff0c;制造出的影分身越强。 针对不同的作战情况&a…

C#友元函数与友元类

在C#中&#xff0c;并没有像C那样的友元函数和友元类的直接语法支持。C#中的访问控制是通过public、private、protected等访问修饰符来实现的&#xff0c;而不是通过友元的概念。 友元函数与友元类的概念 在C中&#xff0c;友元函数和友元类允许一个类或者函数访问另一个类的…

PHP转Go系列 | 变量常量的使用姿势

大家好&#xff0c;我是码农先森。 变量 在 PHP 语言中&#xff0c;初始化变量虽然只有一行&#xff0c;其实包含了两步&#xff0c;一是声明变量&#xff0c;二是赋值给变量&#xff0c;同一个变量可以任意再赋值任何类型的数据。 <?php// 初始化变量 $name "man…

Z世代职场价值观的重塑:从“班味”心态到个人成长的追求

近日&#xff0c;社交平台Soul APP联合上海市精神卫生中心&#xff08;俗称“宛平南路600号”&#xff09;发布《2024年Z世代职场心理健康报告》&#xff08;下称“报告”&#xff09;&#xff0c;发现今天的年轻人正以其独特的价值观和行为模式&#xff0c;重新定义成功与成就…

java 带有返回值的异步处理

1、先创建一个线程池 // 创建一个固定大小的线程池ExecutorService executor Executors.newFixedThreadPool(5); 2、创建一个异步现成执行你所需要执行的业务 CompletableFuture<String> future CompletableFuture.supplyAsync(() -> {System.out.println(Thread.c…

118.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件管理的界面与功能设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

visual studio error MSB8008:

新项目编译的时候&#xff0c;可能由于编译器的版本不一致导致的问题。 你的电脑上有两个不同版本的VS&#xff0c;或者你的程序拷贝到别人的电脑上去运行&#xff0c;或者你是从别人那里拷贝来的项目&#xff0c;而你们俩用的VS版本不一样&#xff0c;就会在运行的时候出现这…

初识Redis数据库(通俗易懂版)

Redis&#xff1a;不只是存储那么简单 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源且高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;同时也是内存数据库&#xff0c;常用于缓存、消息队列、会话存储等应用场景。支持字符串&#x…

MyBatis组件的DAO层拦截器

最近老大想对储存到数据库的数据进行加密&#xff0c;不让某表的某几列以明文的形式储存&#xff0c;巧的是这些数据是公司框架写好的&#xff0c;不能直接上代码改。 而业务层对于这张表的数据&#xff0c;应用的地方非常多&#xff0c;从业务侧进行拦截不现实。 所以&#xf…

Java版-剑指offer数据结构与算法 视频教程 下载

Java版-剑指offer数据结构与算法 视频教程 下载 01-数据结构与算法入门基础 clip.mp4 02-clip1.mp4 03-clip2.mp4 04-基础数据结构&#xff1a;数组&链表&#xff08;一&#xff09;.mp4 05基础数据结构&#xff1a;数组&链表&#xff08;二&#xff09;.mp4 06-基…

成都爱尔周进院长提醒毕业生摘镜,术式如何挑

高考完迎来一个悠长假期&#xff0c;考后放松的同时&#xff0c;也有不少同学开始“准备”。 为奔赴梦想&#xff0c;为了理想的专业和学校&#xff0c;不少人决定摘镜。 不少专业有视力要求&#xff0c;且不同专业方向的要求各有不同。我们先来看看有视力要求的专业有哪些&am…

数据集制作——语义分割前png、jpg格式标签图转yolo格式.txt文件(附代码)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

从0开始C++(二):类、对象、封装

目录 类&对象的概念 类的内容 对象的创建 ● 栈内存对象 ● 堆内存对象 封装 类&对象的概念 类和对象是一个比较抽象的概念&#xff0c;这里直接用一个实例方便理解。 类&#xff1a;类是一个抽象的概念&#xff0c;用来描述同一类对象的特点&#xff08;比如&am…

第九届信也科技杯全球AI算法大赛——语音深度鉴伪识别参赛A榜 0.968961分

遗憾没有进复赛&#xff0c;只是第41名。先贴个A榜的成绩。A榜的前三十名晋级&#xff0c;个个都是99分的大佬&#xff0c;但是B榜的成绩就有点低了&#xff0c;应该是数据不同源的问题&#xff0c;第一名0.78分。官网链接&#xff1a;语音深度鉴伪识别 官方baselin:https://g…

Springboot 权限认证框架 -- SA-Token 简介(一)

引言 现今的软件开发中&#xff0c;权限认证与访问控制是每一个应用都必不可少的功能。SA-Token是一个简单、安全、易用的权限认证框架&#xff0c;它主要解决登录认证、权限认证、Session会话、单点登录等功能。SA-Token以其轻量级、零学习成本的特点&#xff0c;迅速赢得了开…

Java 网关进程在向驱动程序发送其端口号之前退出

java gateway process exited before sending the driver its port number #248TOC Spark项目 这个是远程调试的一个Spark项目&#xff0c;首先要保证 Spark正确安装&#xff0c;配置好环境变量&#xff0c;这是前提。 可能的问题 Java 网关进程是 Apache Spark 的一个关键…

数组的常用方法

1.Array.map() 此方法是将数组中的每个元素调用一个提供的函数&#xff0c;结果作为一个新的数组返回&#xff0c;并没有改变原来的数组 let arr [1, 2, 3, 4, 5]; let newArr arr.map(x > x * 2); //arr [1, 2, 3, 4, 5] 原数组保持不变 //newArr [2, 4, 6, 8, 10] …