首页 > 其他分享 >持续总结中!2024年面试必问 20 道设计模式面试题(六)

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

时间:2024-06-19 21:31:11浏览次数:13  
标签:面试题 必问 聚合 迭代 对象 模式 numbers 设计模式 客户端

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

十一、迭代器模式(Iterator Pattern)解决了什么问题?

迭代器模式(Iterator Pattern)解决了如何顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示的问题。这种模式定义了一种方法来遍历集合,同时保持了对象的封装性,并且允许在不修改现有代码的情况下添加新的迭代方式。

迭代器模式解决的问题:

  1. 访问聚合对象的统一接口:不同的聚合对象可能有不同的内部结构,迭代器模式提供了一种统一的方法来访问它们的元素。

  2. 封装变化:迭代器模式隐藏了聚合对象的具体实现细节,如果聚合对象的内部表示改变,只要迭代器的接口保持不变,客户端代码就不需要修改。

  3. 支持多种遍历方式:可以在同一个聚合对象上定义多个迭代器,以不同的方式遍历集合,例如正向迭代、逆向迭代等。

  4. 提供了一种方式来避免在聚合对象中直接暴露其元素:这有助于保护对象的完整性和封装性。

  5. 简化客户端代码:客户端代码通过迭代器与聚合对象交互,而不需要了解如何遍历聚合对象。

  6. 提供了一种机制来在迭代过程中修改聚合对象:某些迭代器模式的实现允许在迭代过程中安全地添加或删除元素。

迭代器模式的组成部分:

  1. 迭代器(Iterator):定义了访问和遍历元素的接口,如hasNext()next()方法。

  2. 具体迭代器(Concrete Iterator):实现了迭代器接口,并保持了一个当前位置的引用,以便知道在遍历过程中当前所处的位置。

  3. 聚合(Aggregate):定义了一个创建迭代器的方法,通常是一个createIterator()方法。

  4. 具体聚合(Concrete Aggregate):实现了聚合接口,并返回一个具体迭代器的实例,用于遍历集合。

迭代器模式的实际应用:

  1. 集合框架:在很多编程语言的集合框架中,迭代器模式被广泛使用,如Java中的Iterator接口。

  2. 数据结构:在实现复杂的数据结构,如树、图等时,迭代器模式可以提供一种统一的方法来遍历元素。

  3. 复杂对象集合:在需要遍历具有复杂内部结构的对象集合时,迭代器模式可以简化访问过程。

  4. 访问控制:在需要控制对集合元素的访问权限时,迭代器模式可以提供一种灵活的方式来实现。

示例:

假设有一个数字列表,我们希望以不同的方式遍历这个列表。使用迭代器模式,我们可以这样实现:

// 聚合接口
interface Aggregate {
    Iterator createIterator();
}

// 具体聚合
class NumberList implements Aggregate {
    private List<Integer> numbers;

    public NumberList(List<Integer> numbers) {
        this.numbers = numbers;
    }

    @Override
    public Iterator createIterator() {
        return new NumberIterator(this.numbers);
    }
}

// 迭代器接口
interface Iterator {
    boolean hasNext();
    Integer next();
}

// 具体迭代器
class NumberIterator implements Iterator {
    private List<Integer> numbers;
    private int position = 0;

    public NumberIterator(List<Integer> numbers) {
        this.numbers = numbers;
    }

    @Override
    public boolean hasNext() {
        return position < numbers.size();
    }

    @Override
    public Integer next() {
        return numbers.get(position++);
    }
}

// 客户端代码
Aggregate numberList = new NumberList(Arrays.asList(1, 2, 3, 4, 5));
Iterator iterator = numberList.createIterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

在这个例子中,NumberList 是具体聚合,它实现了聚合接口并提供了一个列表的迭代器。NumberIterator 是具体迭代器,实现了迭代器接口,用于遍历列表中的数字。客户端代码通过聚合的createIterator()方法获取迭代器,并使用迭代器来访问列表中的每个元素。这样,即使NumberList的内部实现改变,客户端代码也可以不受影响。

十二、组合模式(Composite Pattern)和装饰器模式有何相似之处?

组合模式(Composite Pattern)和装饰器模式(Decorator Pattern)虽然在目的和应用场景上有所不同,但它们在某些方面存在相似之处:

  1. 对象结构的灵活性:两种模式都允许动态地构建和修改对象的结构。在组合模式中,可以在运行时向组合对象中添加或删除子组件。在装饰器模式中,可以在运行时向对象添加装饰者,以增加额外的职责。

  2. 树形结构的表示:组合模式通常用于表示树形结构的对象,允许客户端以一致的方式处理个别对象和组合对象。装饰器模式也可以用于构建类似树形的结构,通过多层装饰者来逐层增加对象的功能。

  3. 客户端透明性:两种模式都提供了客户端透明性。在组合模式中,客户端不需要区分叶节点和组合节点,因为它们共享相同的接口。在装饰器模式中,客户端不需要区分原始对象和装饰后的对象,因为它们也共享相同的接口。

  4. 递归的使用:在两种模式中,递归是一种常见的实现方式。组合模式中的组合对象可能会递归地调用其子组件的方法。装饰器模式中的装饰者可能会递归地委托给被装饰对象的方法。

  5. 组合/装饰的灵活性:两种模式都允许灵活地组合或装饰对象。在组合模式中,可以灵活地组合不同的对象来形成复杂的结构。在装饰器模式中,可以灵活地添加多个装饰者来增加不同的功能。

  6. 设计原则的遵循:两种模式都遵循了一些共同的设计原则,如开放封闭原则(对扩展开放,对修改封闭)。它们允许在不修改现有代码的基础上扩展对象的行为。

尽管存在上述相似之处,但组合模式和装饰器模式在目的和应用上有明显的区别:

  • 组合模式主要用于创建树形结构的对象,强调的是部分与整体的统一,使得客户端可以一致地处理树中的所有对象。
  • 装饰器模式主要用于动态地给单个对象添加额外的职责,强调的是功能的扩展,而不影响其他对象。

在实际应用中,根据具体的需求和场景,选择合适的模式来设计和实现系统。

标签:面试题,必问,聚合,迭代,对象,模式,numbers,设计模式,客户端
From: https://blog.csdn.net/2401_84542969/article/details/139813111

相关文章

  • 设计模式-利用状态机实现订单状态流转控制
    状态机是状态模式的一种应用,相当于上下文角色的一个升级版。在工作流和游戏中有大量使用。如各种工作流引擎,几乎是状态机的子集和实现,封装状态的变化规则。Spring也给我们提供了一个很好的解决方案。在spring中的组件名称就叫StateMachine。状态机简化状态控制的开发过程,让状态机......
  • 设计模式-命令模式
    命令模式命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方与接收方,请求方只需要请求执行命令,不用关心命令时怎样被接收,怎样被操作以及是否被执行等。命令模式属于行为型模式。角色:接收者......
  • 设计模式-状态模式
    状态模式状态模式也成为状态机模式,是允许对象在内部状态发生改变时改变它的行为。对象看起来好像改变了它的类,属于行为型模式。角色:上下文角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。抽象状态角色(State):定义该状态下的行为,可以有一个或多......
  • 设计模式-迭代器模式
    迭代器模式迭代器模式,又称为游标模式,它提供一种顺序访问集合/容器对象元素的方法,而又无需暴漏集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构,属于行为型模式。角色:抽象迭代器Iterator:负责定义访问和遍历元素的接口具体迭代器Con......
  • 整理好了!2024年最常见 20 道设计模式面试题(五)
    上一篇地址:整理好了!2024年最常见20道设计模式面试题(四)-CSDN博客九、什么是命令模式?它如何帮助实现解耦?命令模式(CommandPattern)是一种行为设计模式,它将一个请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象与执行请求的对象解耦,从而让不同的请求、队列或者......
  • 百度二面,有点小激动!附面试题
    前几天刚面完百度,这不,没两天就收到二面邀请了,还有点小激动呢!来看看这次都问了哪些面试题吧,附答案仅供参考。ConsurrentHashMap如何计算下标?ConsurrentHashMap计算下标和HashMap类似,它的主要执行流程有以下两步:计算key哈希值:JDK1.7:key.hashCode()。JDK1.8+:((h=key.ha......
  • 多线程设计模式之Worker Thread模式
    以前用C/C++写进程池,要么一下子fork最大进程数,要么来一个任务fork一个进程。多线程也可以这样设计,并总结这种模式为WorkerThread模式。类图如下:具体实现参考如下代码(一次性开启足够多的线程):1)Request......
  • 面试题-17.16 按摩师
    力扣题目解题思路java代码力扣题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。示例1:输入:[1,2,......
  • MySQL常见的后端面试题,你会几道?
     为什么分库分表单表数据量过大,会出现慢查询,所以需要水平分表可以把低频、高频的字段分开为多个表,低频的表作为附加表,且逻辑更加清晰,性能更优随着系统的业务模块的增多,放到单库会增加其复杂度,逻辑不清晰,不好维护,所以会对业务进行微服务拆分,同时拆分数据库怎么分库分......
  • Reids高频面试题汇总总结
    一、Redis基础Redis是什么?Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令来操作这些数据结构。Redis的主要特点是什么?高性能:Redis将数据存储在......