首页 > 其他分享 >设计模式-迭代器

设计模式-迭代器

时间:2023-09-03 22:01:28浏览次数:27  
标签:遍历 Java 迭代 元素 模式 聚合 设计模式



文章目录

  • 1. 引言
  • 1.1 概述
  • 1.2 设计模式
  • 1.3 迭代器模式的应用场景
  • 1.4 迭代器模式的作用
  • 2. 基本概念
  • 2.1 迭代器 Iterator
  • 2.2 聚合 Aggregate
  • 2.3 具体聚合 ConcreteAggregate
  • 3. Java 实现迭代器模式
  • 3.1 Java 集合框架
  • 3.2 Java 迭代器接口
  • 3.3 Java 迭代器模式实现示例
  • 4. 迭代器模式的优缺点
  • 4.1 优点
  • 4.2 缺点
  • 5. 迭代器模式和其他设计模式的关系
  • 5.1 迭代器模式和工厂模式
  • 5.2 迭代器模式和组合模式
  • 5.3 迭代器模式和模板方法模式
  • 6. 总结
  • 6.1 迭代器模式的应用场景
  • 6.2 迭代器模式与其他设计模式的关系
  • 6.3 迭代器模式的优缺点


1. 引言

1.1 概述

迭代器模式是一种行为型设计模式,它允许客户端逐个访问聚合对象中的元素,而不用暴露聚合对象的内部表示。

1.2 设计模式

设计模式是解决特定问题的经过验证的最佳实践,它提供了一种通用的解决方案,可以在不同的场景下重复使用。

1.3 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。

设计模式-迭代器_设计模式

1.4 迭代器模式的作用

迭代器模式的主要作用是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。

2. 基本概念

2.1 迭代器 Iterator

迭代器是一个接口,定义了访问和遍历聚合对象元素的方法。迭代器提供了一种统一的访问方式,使得客户端可以不依赖聚合对象的具体类型和内部结构,而直接访问其中的元素。

2.2 聚合 Aggregate

聚合是一个接口,表示一个集合对象。聚合对象通常包含多个元素,可以提供多种访问方法,例如获取某个元素、添加和删除元素等。

2.3 具体聚合 ConcreteAggregate

具体聚合是聚合的具体实现,它实现了聚合接口,并且维护了内部元素的数据结构,例如数组、链表、栈、队列等。

3. Java 实现迭代器模式

3.1 Java 集合框架

Java 集合框架是一组用于存储和操作元素的类和接口。集合框架提供了多种数据结构和算法,可以满足不同场景下的需求。Java 集合框架中的所有集合类都实现了 Iterable 接口,因此都可以使用迭代器进行遍历操作。

3.2 Java 迭代器接口

Java 提供了一个迭代器接口 Iterator,定义了访问和遍历集合中元素的方法。迭代器接口包含多个方法,例如 hasNext()、next()、remove() 等。

以下是迭代器接口的定义:

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

3.3 Java 迭代器模式实现示例

以下是一个使用迭代器模式的简单示例,通过实现 Iterable 和 Iterator 接口,在不暴露内部结构的情况下遍历聚合对象中的元素。

import java.util.Iterator;

public class MyCollection<T> implements Iterable<T> {
    private T[] elements;
    private int size;

    public MyCollection(T[] elements) {
        this.elements = elements;
        this.size = elements.length;
    }

    @Override
    public Iterator<T> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<T> {
        private int index;

        public MyIterator() {
            this.index = 0;
        }

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public T next() {
            return elements[index++];
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        String[] names = {"Alice", "Bob", "Charlie", "Dave"};

        MyCollection<String> collection = new MyCollection<>(names);
        Iterator<String> iterator = collection.iterator();

        while (iterator.hasNext()) {
            String name = iterator.next();
            System.out.println(name);
        }
    }
}

在上述代码中,MyCollection 实现了 Iterable 接口,并且返回一个实现了 Iterator 接口的内部类 MyIterator。MyIterator 中维护了一个 index 变量,表示当前遍历到的元素位置,hasNext() 方法用于判断是否还有下一个元素,next() 方法用于返回当前元素并将 index 加一。

设计模式-迭代器_java_02

4. 迭代器模式的优缺点

4.1 优点

  • 将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,遍历过程不会受到影响。
  • 提供了多种遍历方式,客户端可以根据自己的需求选择合适的遍历方式。
  • 对于不同类型的聚合对象,都可以提供统一的访问方式,使得客户端编码更加简单。

4.2 缺点

  • 对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

5. 迭代器模式和其他设计模式的关系

5.1 迭代器模式和工厂模式

迭代器模式和工厂模式可以相互配合使用。在工厂模式中,可以使用迭代器遍历某个产品对象中的元素,实现对产品的全面访问。

5.2 迭代器模式和组合模式

迭代器模式和组合模式可以相互配合使用。在组合模式中,可以使用迭代器遍历整个组合结构中的所有元素,实现对组合结构的遍历和访问。

5.3 迭代器模式和模板方法模式

迭代器模式和模板方法模式也可以相互配合使用。在模板方法模式中,可以将迭代器作为模板方法的一部分,实现对聚合对象中元素的遍历和访问。

6. 总结

6.1 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。

6.2 迭代器模式与其他设计模式的关系

迭代器模式和工厂模式、组合模式、模板方法模式等其他设计模式可以相互配合使用,实现更加灵活的编程。

6.3 迭代器模式的优缺点

迭代器模式的主要优点是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。其缺点是对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。


标签:遍历,Java,迭代,元素,模式,聚合,设计模式
From: https://blog.51cto.com/u_15918766/7343563

相关文章

  • Go 设计模式中策略模式
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)  在Go设计模式中,策略模式是一种行为型模式,用于在运行时选择算法的行为。策略模式将不同的算法封装成各自的策略对象,并使得这些策略对象......
  • Go 设计模式中访问者模式
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)在Go设计模式中,访问者模式(VisitorPattern)是一种行为型模式,用于将算法与数据结构分离,使得算法可以独立地操作数据结构的不同元素,同时遵循......
  • 设计模式:通俗易懂版
    ......
  • 两个例子理解js设计模式中的【适配器模式】
    适配器模式的精髓:如果现有的接口已经能够正常工作,那我们就永远不会用上适配器模式。适配器模式是一种“亡羊补牢”的模式,没有人会在程序的设计之初就使用它。因为没有人可以完全预料到未来的事情,也许现在好好工作的接口,未来的某天却不再适用于新系统,那么我们可以用适配器模式把旧......
  • 设计模式
    1类与类之间的关系继承(泛化)组合:整体对象可以控制成员对象的生命周期,一旦主体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系,例如人的头部与眼、耳朵聚合:成员对象是整体的一部分,但是成员对象可以脱离主体对象独立存在。主体对象析构到的时候成员对象依......
  • 设计模式:迭代器模式
    设计模式wiki中将设计模式分为四类,分别是:创建模式(creationalpatterns)结构模式(structuralpatterns)行为模式(behavioralpatterns)并发模式(concurrencypatterns)迭代器模式属于其中的行为模式。迭代器做的只有一件事,就是解决集合的遍历问题。以下是wiki对迭代器模式的概括......
  • 设计模式学习1 设计原则
    设计原则1.开闭原则对扩展开放,修改关闭。在程序需要扩展的时候,不能去修改原有代码,实现一个热插拔的效果。为了使程序的扩展性好,易于维护和升级为了达到这样的效果,我们需要使用接口和抽象类2.里氏代换原则任何基类可以出现的地方,子类一定可以出现。也就是子类继承父类时,除了添......
  • 【23种设计模式】单例模式(一)
    前言:单例模式是创建型模式5种中的第1种,关注对象的创建,保证一个类仅有一个实例,并且提供一个全局访问点。在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一......
  • 优化函数迭代每次都要查找的代码
    在做Perfeye需求的时候,有写了一个函数,每次遍历,要根据相同的时间,把对应的数据整合刚开始用findIndex进行每次查找,但是性能很差,后面问了gpt有没有什么操作能不用findIndex,gpt说可以单独存储时间索引值来进行判断旧代码constgetFTimeDataSetSourceData=()=>{constresu......
  • 设计模式:观察者模式/发布-订阅模式
    设计模式wiki中将设计模式分为四类,分别是:创建模式(creationalpatterns)结构模式(structuralpatterns)行为模式(behavioralpatterns)并发模式(concurrencypatterns)观察者/发布订阅模式属于其中的行为模式。实际情境公众号订阅说到发布订阅,拿微信公众号举例,就很好理解,有n个......