首页 > 其他分享 >整理好了!2024年最常见 20 道设计模式面试题(五)

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

时间:2024-06-19 20:30:34浏览次数:9  
标签:面试题 遍历 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());
}

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

标签:面试题,遍历,20,迭代,对象,模式,命令,聚合,设计模式
From: https://blog.csdn.net/weixin_38616368/article/details/139812131

相关文章

  • 20240619打卡-结课博客
    本学期总结博客个人成长与反思随着本学期的结束,我在石家庄铁道大学软件工程专业的学习之旅也迈上了一个新的台阶。回顾这段时间,我不仅在理论知识方面有所提升,更重要的是通过实战项目积累了宝贵的经验。这些经历使我更加认识到,作为一名未来的软件工程师,实操能力和团队合作精神是......
  • P6261 [ICPC2019 WF] Traffic Blights 题解
    思路考虑题目要求的是什么。假设\(p_i\)代表通过前\(i\)个红绿灯的概率。那么我们的答案即为\(p_i-p_{i-1}\)。不妨设\(w_i=r_i+g_i\)。我们的限制条件类似:\[t\not\equiva_i\pmodw_i\]那么所有红绿灯会形成周期\(lcm(w_1,w_2,\cdots,w_n)\)。由于\(2019!\)肯......
  • 【第20章】Vue实战篇之Vue Router(路由)
    文章目录前言一、使用Vue-Router1.安装2.创建路由器实例3.注册路由器插件4.根组件二、访问路由器1.理论2.使用3.展示三、嵌套路由(子路由)1.准备文件2.配置路由3.菜单配置4.展示总结前言VueRouter是Vue.js的官方路由。它与Vue.js核心深度集成,让用......
  • [JOI Open 2024] 中暑
    原问题的规则实际上很大程度上是为最小化而设计的,但是我们却要求的是最大化,这意味着原问题的规则实际上是与我们要最优化的问题相矛盾,可行的办法可能是通过一些转化使新问题与规则刚好契合。考虑原问题的规则实际上告诉我们只有当两边都不能放的时候才会对答案产生贡献,意味着实际......
  • P10540 [THUPC2024] 古明地枣的袜子 题解
    题意:一个长为\(n\)的序列\(a\),初始全为零。\(n\)个操作,第\(i\)个操作形如给\(a_1,\cdots,a_{x_i}\)加上\(y_i\)。\(m\)次查询,给定\(l,r\),求对\(a\)执行第\(l\simr\)个操作后数列\(a\)的全局最大值。\(1\len,m\le5\cdot10^5,1\lex_i,|y_i|\len,1\lel\ler\len\),时间限......
  • ensp通过云连接VMware中Windows Server 2012 中搭建的DHCP服务器实现不同VLAN自动获取
    实验描述通过在ensp中搭建拓扑图实现在VLAN10获取192.168.1.0网段地址,VLAN10获取192.168.1.0网段地址,VLAN20获取192.168.2.0网段地址,VLAN30获取192.168.1.0网段地址,VLAN40获取192.168.4.0网段地址.WindowsServer2012搭建DHCP服务器开启VMware配置网卡信息选择为自定......
  • 蓝桥 3205.小明的素数对(内含试除法,埃氏筛,欧拉筛代码)
    目录题目题目解读思路代码注总结试除法埃氏筛欧拉筛题目题目解读题目意思很简单,就是输入一个树n,然后求1-n里的素数,然后求这些素数里满足他们两两之差也是素数的对数有多少对。思路思路很简单,可直接利用埃式筛选法筛(或利用欧式筛法)筛选出1-n里的素数有什么,然......
  • Redis从入门到精通2024版 视频教程 下载
    Redis从入门到精通2024版视频教程下载├─第01章开篇│   001.Redis录制计划.mp4│   002.Redis介绍.mp4│   003.Redis安装.mp4│    ├─第02章基本数据类型│   01.在后台启动Redis.mp4│   02.基本数据类型-Stri......
  • 2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个
    2024-06-19:用go语言,给定一个起始下标为0的整数数组nums和一个整数k,可以执行一个操作将相邻两个元素按位AND后替换为结果。要求在最多执行k次操作的情况下,计算数组中所有元素按位OR后的最小值。输入:nums=[3,5,3,2,7],k=2。输出:3。解释:执行以下操作:1.将nums[0]......
  • GDCPC 2024 部分题解
    老年人过来对着会的题口胡几发B.腊肠披萨 题意翻译:给你n个小写字母串,求所有小写字母串两两之间的最长公共前缀的乘方和,对一个任意数取模。比较显然的,看到多串公共前缀直接建Trie统计贡献。建好之后对每个串在Trie上走,每走一步加上当前子树内串个数和父子树内串个数之差,就能......