浅谈设计模式:迭代器模式(Iterator Pattern)

热爱生活、享受娱乐、专注技术,欢迎关注QGer,我们一起见证成长!

什么是迭代器模式?

官方解释:to access the elements of an aggregate object sequentially without exposing its underlying implementation.

顺序地访问集合对象的元素并且不暴露它的内部实现

 通俗解释:假设给定一个集合对象,定义一个与之相关联的Iterator(迭代器),该迭代器能够访问集合对象的内部元素,通过迭代的方法能够按照顺序依次访问集合对象的每一个元素。

为什么使用迭代器模式?

  • 它能让集合内部元素结构对于客户端透明的情况下遍历该集合。保证了封装性,透明性。
  • 提供了一个统一的方法去访问你的数据对象(集合),并且你不需要知道数据对象的类型。
  • 实用性很强,得到了广泛的应用,并且拓展性很强,容易自己进行拓展。

如何使用迭代器模式?

UML图如下:

各个组件解释:

  • Iterator:抽象迭代器,定义了迭代器最基本的接口。如:hasNext()表示是否该迭代是否还有下一个元素,next则是返回迭代的下一个元素。
  • Aggregate:抽象集合,定义了集合的基本操作接口。如:add()向该集合增加一个原色,remove()则表示删除某个元素。
  • ComcreteAggregate:具体数据集合类,定义了集合元素的结构,操作细节。同时在类内部定义了一个具体迭代器并提供一个能够返回迭代器对象的方法。
  • ConcreteIterator:具体迭代器,通常定义在聚合类的内部,以此来达到访问聚合类内部数据结构的目的,同时实现了迭代访问聚合类元素的方法。

使用范围:

  • 当你想要在不暴露其内部表示的情况下访问一个对象集合
  • 当你想要有多种遍历方式来遍历一个对象集合,如正序、倒序、跳表访问

应用举例:

假设现在有一个学生对象集合类,客户端并不想关心其内部细节,只需要能遍历学生对象(或者学生对象的某些属性)即可。使用迭代器模式来实现这个需求。

1、定义迭代器以及集合的抽象接口。

interface Iterator<T> {
    T next();
    boolean hasNext();
}
interface Collection<T> {
    boolean add(T element);
    boolean remove(T element);
}

2、定义学生对象类,简明起见,不定义太多复杂属性

public class Student {
    private String id;
    private String name;
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
}

3、实现具体学生对象聚合类,并在内部依赖定义具体迭代器。

public class StudentList implements Collection<Student> {
    List<Student> elementList = new ArrayList<>();
    @Override
    public void add(Student element) {
        elementList.add(element);
    }
    @Override
    public boolean remove(Student element) {
        return elementList.remove(element);
    }
    public Iterator<Student> createIterator(){
        return new StudentIterator(elementList);
    }
    //具体迭代器类
    private class StudentIterator implements Iterator<Student> {
        private List<Student> students;
        private int position;
        public StudentIterator(List<Student> students) {
            this.students = students;
            this.position = 0;
        }
        @Override
        public Student next() {
            if(hasNext()) {
                return students.get(position++);
            }
            return null;
        }
        @Override
        public boolean hasNext() {
            return position < students.size();
        }
    }
}

4、使用客户端调用,此处mock一个测试数据,方便调用。

public class Client {
    public static void main(String[] args) {
        StudentList studentList = new StudentList();
        studentList.add(new Student("001", "张三"));
        studentList.add(new Student("002", "李四"));
        studentList.add(new Student("004", "赵五"));
        studentList.add(new Student("004", "钱六"));

        Iterator<Student> iterator = studentList.createIterator();
        while(iterator.hasNext()){
            Student student = iterator.next();
            System.out.println(student.getId() + student.getName());
        }
    }
}

注:此处的抽象迭代器、抽象集合接口,均只声明了最简单常用的方法,之际开发中可以根据需求增加各种各样的方法,如Java.Util里面的Iterator定义接口如下:

迭代器则可以根据具体的聚合,选择不同的遍历方式:正序、倒序、跳表等。而遍历的可以不是整个对象,或许你指向遍历对象的某个属性呢,如上例你指向要遍历学生的学号,或者说学号用得最勤快,那么你另外定义一个迭代方法nextId来遍历学生的学号呀。

时间: 2024-10-31 23:54:34

浅谈设计模式:迭代器模式(Iterator Pattern)的相关文章

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 迭代器模式(iterator pattern) 详解

迭代器模式(iterator pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包含hasNext()方法和next()方法; 不同聚合对象的具体的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator in

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

设计模式 - 迭代器模式(iterator pattern) 具体解释

迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序訪问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包括hasNext()方法和next()方法; 不同聚合对象的详细的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator

[设计模式] 迭代器模式 Iterator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角色组成: 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口.2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置.3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口.4.具体集合角色(Concre

设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包括迭代器接口(iterator interface), import java.util.Iterator; 继承

二十四种设计模式:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现在要提供一种方法顺序地访问这个聚合对象中的各个元素. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Iterator { /// <summary>

设计模式(行为型)之迭代器模式(Iterator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之观察者模式(Observer Pattern)>http://blog.csdn.net/yanbober/article/details/45484749 概述 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构

16.迭代器模式(Iterator Pattern)

using System; namespace ConsoleApplication9 { class Program { /// <summary> /// 迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素, /// 而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构, /// 又可让外部代码透明地访问集合内部的数据. /// </summary> /// <param name="args"></par

用最简单的例子理解迭代器模式(Iterator Pattern)

迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装到一个接口中. public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); } 在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口. publi