设计模式之迭代器模式

2017-06-13  本文已影响11人  老羊_肖恩

迭代器模式的定义

迭代器模式(Iterator Pattern)的定义如下:
  Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 即:它提供一种方法访问衣蛾容器对象各个元素,而不暴露该对象的内部细节。
  迭代器模式是为容器服务的,如Collection, Set等。迭代器模式就是为了解决便利这些容器中的元素而诞生的。其通用类图如下所示:


Iterator.jpg

  适配器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。看一下迭代器模式中的各个角色:

适配器模式的通用代码如下:

import java.util.Vector;

//抽象迭代器
interface Iterator{
    //遍历下一个元素
    public Object next();
    //是否遍历到尾部
    public boolean haNext();
    //删除当前指向的元素
    public boolean remove();
}

//具体迭代器
@SuppressWarnings("rawtypes")
class ConcreteIterator implements Iterator{

    private Vector vector = new Vector();
    
    //定义当前游标
    private int cursor = 0;
    
    public ConcreteIterator(Vector vector) {
        this.vector = vector;
    }
    
    @Override
    public Object next() {
        if(this.haNext())
            return this.vector.get(cursor++);
        return null;
    }

    @Override
    public boolean haNext() {
        if(cursor == this.vector.size()){
            return false;
        }
        return true;
    }

    @Override
    public boolean remove() {
        this.vector.remove(cursor);
        return false;
    }
    
}

//抽象容器
interface Aggregate{
    //增加元素
    public void add(Object obj);
    //删除元素
    public void remove(Object obj);
    
    //迭代器
    public Iterator iterator();
}

//具体容器类
@SuppressWarnings("rawtypes")
class ConreteAggregate implements Aggregate{
    private Vector vector = new Vector();

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

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

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(vector);
    }
    
}

//客户端
public class IteratorClient{
    public static void main(String[] args) { 
        //声明容器类
        Aggregate agg = new ConreteAggregate();
        
        //插入数据
        agg.add("1");
        agg.add("2");
        agg.add("3");
        
        //遍历
        Iterator iterator = agg.iterator();
        System.out.println("before iterator...");
        while (iterator.haNext()) {
            System.out.println(iterator.next());
        }
        System.out.println("after iterator...");
    }
}

通用代码的运行结果如下:

before iterator...
1
2
3
after iterator...

迭代器模式的应用

JDK1.2开始增加了java.util.Iterator接口,将Iterator应用到各种Collections中。

《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。

上一篇下一篇

猜你喜欢

热点阅读