设计模式之迭代器模式--- Pattern Iterator

模式的定义

迭代器模式定义:

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节。

类型

行为类

模式的使用场景

方便遍历访问容器内的元素

优点

面向对象设计原则中的单一职责原则,对于不同的功能,我们要尽可能的把这个功能分解出单一的职责,不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据

缺点

  • 会产生多余的对象,消耗内存;
  • 遍历过程是一个单向且不可逆的遍历
  • 如果你在遍历的过程中,集合发生改变,变多变少,内容变化都是算,就会抛出来ConcurrentModificationException异常.

UML类图

角色介绍

Iterator –抽象迭代器

抽象迭代器负责定义访问和遍历元素的接口,而且有固定的3个方法:first()获得第一个元素,next()访问下一个元素,hasNext()是否有下一个元素。

ConcreteIterator —具体迭代器

实现迭代器接口,完成容器元素遍历

Aggregate —抽象容器

提供一个iterator()方法

ConcreteAggregate —具体容器

实现抽象容器的接口

模式的通用源码

Iterator :


public interface Iterator {

    public Object next();

    public boolean hasNext();

    public boolean remove();
}

ConcreteIterator :

import java.util.Vector;

public class ConcreteIterator implements Iterator {

    private Vector vector = new Vector();

    private int cursor = 0;

    public ConcreteIterator(Vector vector) {
        super();
        this.vector = vector;
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        Object result;
        if(hasNext()){
            result = vector.get(cursor++);
        }else {
            result = null;
        }
        return result;
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        if(cursor == vector.size()){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public boolean remove() {
        // TODO Auto-generated method stub
        vector.remove(cursor);
        return true;
    }
}

Aggregate :


public interface Aggregate {

    public void add(Object object);

    public void remove(Object object);

    public Iterator iterator();
}

ConcreteAggregate :

import java.util.Vector;

public class ConcreteAggregate implements Aggregate {

    private Vector vector = new Vector();

    @Override
    public void add(Object object) {
        // TODO Auto-generated method stub
        vector.add(object);
    }

    @Override
    public void remove(Object object) {
        // TODO Auto-generated method stub
        vector.remove(object);
    }

    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return new ConcreteIterator(vector);
    }
}

Client 类:

import java.util.Vector;

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //使用java现有的Iterator迭代器来实现遍历元素
        Vector vector = new Vector();
        vector.add("a");
        vector.add("b");
        vector.add("c");
        java.util.Iterator iterator =  vector.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("--------------");
        //使用我们定义的Iterator迭代器来实现遍历元素
        ConcreteAggregate concreteAggregate = new ConcreteAggregate();
        concreteAggregate.add("a");
        concreteAggregate.add("b");
        concreteAggregate.add("c");

        Iterator iterator_02 = concreteAggregate.iterator();
        while (iterator_02.hasNext()) {
            System.out.println(iterator_02.next());
        }

    }
}

输出结果

a
b
c
--------------
a
b
c

Android源码中的模式实现

我们先查看一下Iterator类:

./libcore/luni/src/main/java/java/util/Iterator.java
public interface Iterator<E> {
    /**
     * Returns true if there is at least one more element, false otherwise.
     * @see #next
     */
    public boolean hasNext();

    /**
     * Returns the next object and advances the iterator.
     *
     * @return the next object.
     * @throws NoSuchElementException
     *             if there are no more elements.
     * @see #hasNext
     */
    public E next();

    /**
     * Removes the last object returned by {@code next} from the collection.
     * This method can only be called once between each call to {@code next}.
     *
     * @throws UnsupportedOperationException
     *             if removing is not supported by the collection being
     *             iterated.
     * @throws IllegalStateException
     *             if {@code next} has not been called, or {@code remove} has
     *             already been called after the last call to {@code next}.
     */
    public void remove();
}

我们可以看到Iterator,正如我们想的一样是一个接口,分别定义了三个方法:remove(),next(),hasNext()。

杂谈

因为java中,我们已经实现了java.util.Iterator接口,所有我们是经常用,但是都没有感觉到此设计模式。一般来说,在java开发中,我们不需要重新写一个Iterator的迭代,直接使用Collection下的实现容器类就可以了。

参考资料

(1).设计模式之禅—第20章 迭代器模式

(2)迭代器模式

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/iterator/haoxiqiang

时间: 2024-10-26 09:31:25

设计模式之迭代器模式--- Pattern Iterator的相关文章

设计模式之迭代器模式(Iterator)

1.定义 迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节. 基本上没有人会单独写一个迭代器,除非是产品性质的开发. 2.通用类图 Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素:next()访问下一个元素:isDone()是否已经访问到底部(Java 叫做hasNext()方法). ConcreteIterator具体迭代器:具体迭代器角色要实现迭代器接口,完成容器元素的遍历. Ag

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

这篇博客,我们要详细讲解的是迭代器模式(Iterator Pattern),将要讲解的内容有:迭代器模式 的定义,作用,详细设计分析等方面. 一.Pattern name 迭代器模式(Iterator Pattern) : 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示.--<设计模式 可复用面向对象软件的基础> 二.Problem 在我们实际编程的过程中,经常会遇到下面这种情况: 当我们需要遍历某个集合的时候,常常调用某个类的一个方法,返回一个集合类型的数据,如下:

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

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是迭代器模式? 官方解释:to access the elements of an aggregate object sequentially without exposing its underlying implementation. 顺序地访问集合对象的元素并且不暴露它的内部实现 通俗解释:假设给定一个集合对象,定义一个与之相关联的Iterator(迭代器),该迭代器能够访问集合对象的内部元素,通过迭代的方法能够按照顺

C#设计模式(16)——迭代器模式(Iterator Pattern)

一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. 二.迭代器模式的介绍 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对象设计原则中有一条是单一职责原则,所以我们要尽可能地分离这些职责,用不同的类去

JAVA设计模式之 迭代器模式【Iterator Pattern】

一.概述 提供一种方法来访问聚合对象(容器container),而不用暴露这个对象的内部细节. 二.适用场景 1>遍历访问聚合对象中的元素,而无须暴露它的内容表示,将聚合对象的访问和内部数据的存储分离.使得访问聚合对象时无须了解其内部的实现细节. 2>需要为一个聚合对象提供多种遍历实现. 三.UML类图 四.参与者 1>Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()

23种设计模式之迭代器模式(Iterator)

迭代器模式是一种对象的行为型模式,提供了一种方法来访问聚合对象,而不用暴露这个对象的内部表示.迭代器模式支持以不同的方式遍历一个聚合对象,复杂的聚合可用多种方法来进行遍历:允许在同一个聚合上可以有多个遍历,每个迭代器保持它自己的遍历状态,因此,可以同时进行多个遍历操作. 优点: 1)支持集合的不同遍历. 2)简化了集合的接口. 使用场景: 1)在不开发集合对象内部表示的前提下,访问集合对象内容. 2)支持集合对象的多重遍历. 3)为遍历集合中的不同结构提供了统一的接口. Iterator 模式

【设计模式】迭代器模式(Iterator )

摘要: 1.本文将详细介绍迭代器模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入迭代器模式 2. 迭代器的概念及优缺点介绍 3. 迭代器在Android源码中的应用 1.段子404 Not Found: 迭代器(迭代子)模式真的找不到段子了,不过好在这个模式不仅非常好理解,而且例子很多.cnblogs博主卡奴达摩曰:如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式.下面我们一起来学习. 2.迭代器模式介绍 2.

GOF23设计模式之迭代器模式(iterator)

一.迭代器模式概述 提供一种可以遍历聚合对象的方式.又称为:游标(cursor)模式 结构: (1)聚合对象:存储数据 (2)迭代器:遍历数据 二.迭代器模式示例代码 定义:正向遍历迭代器和逆向遍历迭代器 1 /** 2 * 自定义迭代器接口 3 * @author CL 4 * 5 */ 6 public interface MyIterator { 7 /** 8 * 如果仍有元素可以迭代,则返回 true 9 * @return 10 */ 11 boolean hasNext(); 12

【Unity与23种设计模式】迭代器模式(Iterator)

GoF中定义: "在不知道集合内部细节的情况下,提供一个按序方法存取一个对象集合体的每一个单元." 迭代器模式由于经常使用到 已经被现代程序设计语言纳为标准语句或收录到标准函数库中 在C#中,经常使用泛型存储对象 当想按序存取这些泛型容器时,都会使用C#的foreach语句 foreach语句就是一个能顺序访问一个集合的方法 它便是C#语言内置的迭代器模式 当然 其他现代语言也提供了类似的语句