设计模式(20)-----迭代器模式

迭代器模式(Iterator)

定义

  提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

UML类图

角色

  迭代器角色(Iterator): 负责定义访问和遍历元素的接口。
  具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置。
  容器角色(Aggregate):  负责提供创建具体迭代器角色的接口。
  具体容器角色(Concrete Aggregate):实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关。

例子

  Iterator

package com.csdhsm.pattemdesign.iterator;

/**
 * @Title:  Iterator.java
 * @Description: 迭代抽象类
 * @author: Han
 * @date:   2016年6月26日 下午3:12:33
 */
public interface Iterator {

    //判断是否还有下一个
    public boolean hasNext();

    //拿出当前元素,并游标向下移动一个
    public Object next();
}

  ConcreteIterator

package com.csdhsm.pattemdesign.iterator;

import java.util.List;

/**
 * @Title:  ConcreteIterator.java
 * @Description: 具体迭代实现
 * @author: Han
 * @date:   2016年6月26日 下午3:07:14
 */
public class ConcreteIterator implements Iterator {

    private List<Object> list;
    //当前游标,初始为0
    private int cursor = 0;

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

    @Override
    public boolean hasNext() {
        return !(cursor == list.size());
    }

    @Override
    public Object next() {
        Object object = null;

        if(hasNext()) {
            //得到当前游标对应元素,并且游标加1
            object = list.get(cursor++);
        }

        return object;
    }
}

  Aggregate

package com.csdhsm.pattemdesign.iterator;

/**
 * @Title:  Aggregate.java
 * @Description: 聚集抽象类
 * @author: Han
 * @date:   2016年6月26日 下午3:13:05
 */
public interface Aggregate {

    //增加元素
    public void add(Object obj);

    //删除元素
    public void remove(Object obj);

    //得到迭代器
    public Iterator iterator();
}

  ConcreteAggregate

package com.csdhsm.pattemdesign.iterator;

import java.util.List;

/**
 * @Title:  ConcreteAggregate.java
 * @Description: 具体聚集类
 * @author: Han
 * @date:   2016年6月26日 下午3:13:22
 */
public class ConcreteAggregate implements Aggregate {

    private List<Object> list;

    public ConcreteAggregate(List<Object> list) {
        this.list = list;
    }

    @Override
    public void add(Object obj) {
        this.list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        this.list.remove(obj);
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this.list);
    }
}

  客户端

package com.csdhsm.pattemdesign.iterator;

import java.util.ArrayList;
import java.util.List;

public class Solution {

    public static void main(String[] args) {

        List<Object> list = new ArrayList<>();
        Aggregate aggregate = new ConcreteAggregate(list);

        aggregate.add("张三");
        aggregate.add("李四");
        aggregate.add("王二");
        aggregate.add("麻子");

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

  结果

总结

  

  迭代器模式的优点有:

  • 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
  • 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
  • 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

迭代器模式的缺点

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
时间: 2024-10-09 10:30:15

设计模式(20)-----迭代器模式的相关文章

笔记-大话设计模式-20 迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. Demo1: abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } abstract class Aggregate { pub

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

【设计模式】——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato

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

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

2018.4.30 设计模式之迭代器模式

设计模式之迭代器模式 1.定义/概念 迭代器模式是Java和.Net编程环境中非常常用的设计模式.这种设计模式用于顺序访问集合对象的元素要知道集合对象的底层表示.迭代器模式属于行为型模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.角色和定义 ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问

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

模式的定义 迭代器模式定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 类型 行为类 模式的使用场景 方便遍历访问容器内的元素 优点 面向对象设计原则中的单一职责原则,对于不同的功能,我们要尽可能的把这个功能分解出单一的职责,不

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

大话设计模式_迭代器模式(Java代码)

迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示 简单描述:提供一个单独的接口遍历聚集类对象中的成员,以实现聚集对象的隐藏和内部数据供外部访问 大话设计模式中的截图: 我觉得以上面的图示进行编码会暴露ConcreteAggregate中的内部信息(ConcreteIerator可以访问聚集类中的成员,那表示其他类也可以和ConcreteIerator一样进行相同的访问),所以我以另外一种形式实现迭代器(即内部类的方式,和Java中的ArrayList类似) 代码

【GOF23设计模式】迭代器模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.iterator; 2 /** 3 * 自定义的迭代器接口 4 */ 5 public interface MyIterator { 6 void first(); //将游标指向第一个元素 7 void next(); //将游标指向下一个元素 8 boolean hasNext(); //判断是否存在下一个元素 9 10 boolea