首页 > 其他分享 >小谈设计模式(21)—迭代器模式

小谈设计模式(21)—迭代器模式

时间:2023-12-15 11:32:09浏览次数:26  
标签:遍历 聚合 21 迭代 小谈 对象 items 设计模式 public

(小谈设计模式(21)—迭代器模式)

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。在这里插入图片描述

迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而不需要暴露聚合对象的内部表示。迭代器模式将遍历元素的责任交给迭代器对象,从而简化了聚合对象的接口。 在这里插入图片描述

对象分析

聚合对象(Aggregate)

聚合对象是包含一组元素的对象,它通常提供一个创建迭代器的方法。聚合对象可以是一个集合、数组、列表等。聚合对象的主要职责是通过迭代器对象提供对元素的遍历。

在这里插入图片描述

迭代器对象(Iterator)

迭代器对象负责遍历聚合对象中的元素。它通常包含一些基本的方法,如获取下一个元素、判断是否还有下一个元素等。迭代器对象可以根据具体的需求实现不同的遍历方式,如正向遍历、逆向遍历等。 在这里插入图片描述

Java程序示例

// 聚合对象
public interface Aggregate {
    Iterator createIterator();
}

// 具体的聚合对象
public class ConcreteAggregate implements Aggregate {
    private List<Object> items = new ArrayList<>();

    public void addItem(Object item) {
        items.add(item);
    }

    public Iterator createIterator() {
        return new ConcreteIterator(items);
    }
}

// 迭代器对象
public interface Iterator {
    boolean hasNext();
    Object next();
}

// 具体的迭代器对象
public class ConcreteIterator implements Iterator {
    private List<Object> items;
    private int position = 0;

    public ConcreteIterator(List<Object> items) {
        this.items = items;
    }

    public boolean hasNext() {
        return position < items.size();
    }

    public Object next() {
        Object item = items.get(position);
        position++;
        return item;
    }
}

// 使用迭代器模式
public class Main {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.addItem("Item 1");
        aggregate.addItem("Item 2");
        aggregate.addItem("Item 3");

        Iterator iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            Object item = iterator.next();
            System.out.println(item);
        }
    }
}

在这里插入图片描述

程序分析

1

在上述示例中,Aggregate 接口定义了创建迭代器的方法 createIterator,ConcreteAggregate 是具体的聚合对象,实现了 createIterator 方法,返回具体的迭代器对象 ConcreteIterator。ConcreteIterator 实现了 Iterator 接口,提供了遍历聚合对象中元素的功能。

2

在 Main 类中,我们创建了一个具体的聚合对象 ConcreteAggregate,添加了一些元素。然后通过 createIterator 方法创建了一个迭代器对象,并使用 while 循环遍历聚合对象中的元素。 在这里插入图片描述

优缺点分析

优点

简化了聚合对象的接口

迭代器模式将遍历聚合对象的责任封装在迭代器对象中,使得聚合对象的接口更加简洁,只需要提供一个创建迭代器的方法即可。

统一的遍历方式

迭代器模式提供了一种统一的遍历方式,无论聚合对象的内部结构如何变化,都可以通过迭代器对象进行遍历,使得客户端代码更加简洁和可读。

增加了代码的可读性和可维护性

迭代器模式将遍历逻辑封装在迭代器对象中,使得代码的逻辑更加清晰,易于理解和维护。

缺点

增加了系统的复杂性

引入迭代器模式会增加系统的类和对象的数量,增加了系统的复杂性。

迭代器的实现可能会受到聚合对象的影响

迭代器的实现通常依赖于聚合对象的内部结构,如果聚合对象的结构发生变化,可能需要相应地修改迭代器的实现。

不适合对于某些特殊聚合对象的遍历

迭代器模式适用于遍历聚合对象的情况,但对于某些特殊的聚合对象,如树形结构,可能需要使用其他遍历方式。

总结

迭代器模式通过封装遍历聚合对象的责任,简化了聚合对象的接口,提供了一种统一的遍历方式,增加了代码的可读性和可维护性。然而,迭代器模式也会增加系统的复杂性,可能受到聚合对象的影响,并且不适用于某些特殊聚合对象的遍历。因此,在使用迭代器模式时需要权衡其优缺点,根据具体情况进行选择。

标签:遍历,聚合,21,迭代,小谈,对象,items,设计模式,public
From: https://blog.51cto.com/u_16193391/8833134

相关文章

  • 202312142321_《遍历 for customised data structure 》
    functioncalculateAssembledSetsAndReturnSkus(suitComponents,inventory){letcomponentCount={};letminComponent={};letresult={};//CountcomponentsinsuitComponentsObject.entries(suitComponents).forEach(([_,components])......
  • 20231214
    件需求与分析课堂测试十——综合案例分析(5分) 班级:信2105-2  学号:20213866   姓名:吕晓彤根据下列案例需求描述,回答相关问题:有一个对外营业的会议中心,有各种不同规格的会议室,为用户提供以下服务:1、用户可以按照会议人数、会议时间预订会议室。可以只预订1次,也可预订定期......
  • 写写我认知中的设计模式
    创建型我印象最深刻的就是单例模式,我记得他有一个特别经典的案例:任务管理器;而且我对这个模式的印象也比较深刻:将创建方法私有化,意味着不可以再次创建对象,仅对对象的调用。最近有所感悟的是生成器模式,其实上次软考的学习中我唯一不理解的就是生成器模式,当时听zst2003老师讲,一头雾......
  • FolkMQ 内存型消息中间件,v1.0.21 发布
    简介采用“多路复用”+"内存运行"+"快照持久化"+"Broker集群模式"(可选)+基于Socket.D网络应用协议开发。全新设计,自主架构!角色功能生产端发布消息(Qos0、Qos1)、发布定时消息(Qos0、Qos1)、发布重试消费端订阅、取消订阅消费端消费-ACK(自动、手......
  • Python实现软件设计模式2:工厂方法模式
    特点工厂存在父类和子类,产品存在父类和子类。工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象。包含的角色Product抽象产品ConcreteProduct具体产品Factory抽象工厂ConcreteFactory具体工厂模式分析工厂方法模式是简单工厂模式的进......
  • 关于设计模式
    一、设计原则:保留不变的部分,抽取变化的部分面向接口编程多用组合,少用继承对拓展开放,对修改关闭二、设计模式1、策略模式利用多态,将变化的部分抽象成一个接口,针对该接口有不同的实现2、观察者模式主题接口和观察者接口主题维护观察者的增加、删除、通知;3、装饰者模式......
  • C1021 无效的预处理器命令“warning”(CGAL)
    1、错误:fatalerrorC1021:无效的预处理器命令“warning” 2、错误定位:\cgal\include\CGAL\internal\enable_third_party_libraries.h3、错误原因:未包含“gmp.h”文件的include路径4、解决方式:添加“gmp.h”文件的include路径 ......
  • 软件设计模式需要考虑的原则
    1.单一职责原则(SRP,SingleResponsibilityPrinciple)一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。职责分离,提升模块的可复用性,SRP是实现高内聚、低耦合的指导方针。2.开闭原则(OCP,Open-ClosedPrinciple)软件实体应该对扩展开放,对修改关闭。表示软件实体......
  • Python实现软件设计模式1:简单工厂/静态工厂模式
    包含的角色工厂角色Factory静态方法抽象产品角色Product声明公用的抽象方法和属性具体产品角色ConcreteProduct覆盖抽象产品中声明的方法,多种产品多种覆盖模式特点可以降低系统耦合度,使用工厂方法时无需知道对象创建细节,传入工厂类的参数可以是字......
  • springboot虚拟线程(jdk21,springboot3.2.0)
    1.什么是虚拟线程虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这就......