行为模式之迭代器模式

迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。

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

类图如下所示。

迭代器模式有以下4个角色。

  • 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
  • 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
  • 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
  • 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。

 Iterator.java

public interface Iterator {
    public Object next();
    public boolean hasNext();
}

ConcreteIterator.java

public class ConcreteIterator implements Iterator {
    private ConcreteAggregate agg;
    private int index = 0;
    private int size = 0;
    public ConcreteIterator(ConcreteAggregate agg) {
        this.agg = agg;
        size = agg.size();
        index = 0;
    }
    @Override
    public Object next() {
        if (index < size) {
            return agg.getElement(index++);
        } else {
            return null;
        }
    }
    @Override
    public boolean hasNext() {
        return index < size;
    }
}

Aggregate.java

public interface Aggregate {
    public void add(Object obj);
    public Iterator createIterator();
}

ConcreteAggregate.java

public class ConcreteAggregate implements Aggregate {
    private Vector vector = new Vector();
    @Override
    public void add(Object obj) {
        this.vector.add(obj);
    }
    public Object getElement(int index) {
        if (index < this.vector.size()) {
            return vector.get(index);
        } else {
            return null;
        }
    }
    public int size() {
        return vector.size();
    }
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        // 定义聚集对象
        Aggregate agg = new ConcreteAggregate();
        agg.add("张三");
        agg.add("李四");
        agg.add("王五");
        // 遍历
        Iterator iterator = agg.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

运行结果如下所示。

张三
李四
王五

优点:

  • 简化了访问容器元素的操作,具备一个统一的遍历接口。
  • 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。

缺点:

  • 给使用者一个序列化的错觉,从而产生错误。

应用场景:

  • 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,133-138.

原文地址:https://www.cnblogs.com/yewen1234/p/10030726.html

时间: 2024-10-12 22:49:08

行为模式之迭代器模式的相关文章

(18):(行为型模式) Iterator 迭代器模式

(18):(行为型模式) Iterator 迭代器模式

Java进阶篇设计模式之九----- 解释器模式和迭代器模式

前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern). 解释器模式 简介 解释器模式顾名思义,就是对某事物进行解释.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 解释器模式

行为型模式之迭代器模式

概述 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合对象的基本职责:而后者既是可变化的,又是可分离的.因此,可以将遍历数据的行为从聚合对象中分离出来,封装在一个被称之为“迭代器”的对象中,由迭代器来提供遍历聚合对象内部数据的行为,这将简化聚合对象的设计,更符合“单一职责原则”的要求. 定义 迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cu

JavaScript---设计模式之迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. jQuery中我们经常会用到一个each函数就是迭代器模式 作用 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作 对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又想让客户代码透明的访问其中的元素,这种情况下我们可以使用迭代器模式. 注意事项 一般的迭代,我们至少要有2个方法,hasNext和Next,这样才做到遍历所有对象. 遍历的同时更改迭代器所在的集合

25行为型模式之迭代器模式

概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题.或者说,如果不使用Iterator模式,会存在什么问题. 1.由容器自己实现顺序遍历.直接在容器类里直接添加顺序遍历方法 2.让调用者自己实现遍历.直接暴露数据细节给外部. 以上方法1与方法2都可以实现对遍历,这样有问题呢? 1,容器类承担了太多功能:一方

设计模式——行为型模式之迭代器模式(八)

迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JA

设计模式5(命令模式,迭代器模式)

命令模式 本质是封闭请求,其关键是把请求封闭成对象,也就是命令对象,并定义了统一的执行操作的接口,这个命令可以存储.转发.记录.处理.撤消等.整个命令模式都是围绕这个对象进行. 命令模式       组合模式 宏命令的功能可以使用组合模式     备忘录模式   可以用来支持命令模式的撤销操作   模板方法     可与命令模式相互替换 迭代器Iterater 提供一种方法顺序访问聚合对象的各个元素,而不暴露该对象的内部表示 关键思想是把对聚合对象的访问从聚合对象中出来,放入单独的迭代器中. 迭

Iterator模式(C++迭代器模式)

基本上来说,Iterator模式并没有什么可多说得,在STL中见得实在太多了,一般用于遍历数据结构,其实现也相对简单. 代码如下: ////////////////////////////////////////////////////////////////////////// // author: Jeson Yang //date:2014.12.10 //file:main.cpp /////////////////////////////////////////////////////

java23中设计模式之迭代器模式

package com.bdqn.iterator; public interface MyIterator { //将游标指向第一个元素 void first(); //将游标指向下一个元素 void next(); //判断存在下一个元素 boolean hasNext(); boolean iSFirst(); boolean iSLast(); //获取当前游标指向的对象 Object getCurrentObj(); } MyIterator package com.bdqn.iter