美文网首页
设计模式之旅22--迭代器模式

设计模式之旅22--迭代器模式

作者: 小楠总 | 来源:发表于2018-08-14 11:13 被阅读55次

1. 定义

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

迭代器是为容器服务的。迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。

迭代器模式

2. 使用场景

  • 需要遍历一个容器对象的时候。
  • 由于Java API已经提供了java.util.Iterator接口,并且基本的容器类已经实现了这个接口。换句话说,Java已经把迭代器模式融入到基本的API中,因此开发者不需要手写迭代器模式。

3. 实现

迭代器:

/**
 * 抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口
 */
public interface Iterator {
    //遍历到下一个元素
    Object next();
    //是否已经遍历到尾部
    boolean hasNext();
    //删除当前指向的元素
    boolean remove();
}

/**
 * 具体迭代器
 */
public class ConcreteIterator implements Iterator {

    private Vector mVector;
    //定义当前游标
    private int mCursor = 0;

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

    @Override
    public Object next() {
        if (this.hasNext()) {
            return this.mVector.get(this.mCursor++);
        } else {
            return null;
        }
    }

    @Override
    public boolean hasNext() {
        if (this.mCursor == this.mVector.size()) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public boolean remove() {
        this.mVector.remove(this.mCursor);
        return true;
    }
}

容器:

/**
 * 抽象容器:容器角色负责提供容器的基本操作、创建具体迭代器角色的接口,在Java中一般是iterator()方法。
 */
public interface Aggregate {
    void add(Object o);
    void remove(Object o);
    Iterator iterator();
}

/**
 * 具体容器
 */
public class ConcreteAggregate implements Aggregate {

    private Vector mVector = new Vector();

    @Override
    public void add(Object o) {
        this.mVector.add(o);
    }

    @Override
    public void remove(Object o) {
        this.mVector.remove(o);
    }

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

场景类:

public class Client {

    public static void main(String[] args) {
        Aggregate agg = new ConcreteAggregate();
        agg.add("a");
        agg.add("b");
        agg.add("c");

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

4. 优点

  • 支持以不同的方式去遍历一个容器对象,也可以有多个遍历。
  • 弱化了容器类与遍历算法之间的关系。

5. 缺点

  • 类文件增加。

相关文章

网友评论

      本文标题:设计模式之旅22--迭代器模式

      本文链接:https://www.haomeiwen.com/subject/lprumftx.html