大话设计模式之迭代器模式总结-java实现

注:示例来自《大话设计模式》

假如现有如下场景 公交车上 乘务员按顺序让每个人买票 使用迭代器模式简单实现如下

Iterator迭代器抽象类

package Test20;

public abstract class Iterator {

    public abstract Object First();
    public abstract Object Next();
    public abstract boolean IsDone();
    public abstract Object CurrentItem();

}

Aggregate聚集抽象类

package Test20;

public abstract class Aggregate {

    public abstract Iterator CreateIterator();

}

ConcreteIterator具体迭代器类

package Test20;

public class ConcreteIterator extends Iterator {

    private ConcreteAggregate aggregate;
    private int current = 0;

    public ConcreteIterator(ConcreteAggregate aggregate)
    {
        this.aggregate = aggregate;
    }

    @Override
    public Object First() {
        return aggregate.get(0);
    }

    @Override
    public Object Next() {
        Object ret = null;
        current++;

        if (current < aggregate.getCount())
        {
            ret = aggregate.get(current);
        }

        return ret;
    }

    @Override
    public boolean IsDone() {
        return (current >= aggregate.getCount()) ? true : false;
    }

    @Override
    public Object CurrentItem() {
        return aggregate.get(current);
    }

}

ConcreteAggregate具体聚集类

package Test20;

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

public class ConcreteAggregate extends Aggregate {

    private List<Object> items = new ArrayList<Object>();

    @Override
    public Iterator CreateIterator() {
        return new ConcreteIterator(this);
    }

    public int getCount() {
        return items.size();
    }

    public Object get(int index) {
        return items.get(index);
    }

    public void set(int index, Object element) {
        items.add(index, element);
    }

}

客户端代码

package Test20;

public class Program {

    public static void main(String[] args) {

        ConcreteAggregate a = new ConcreteAggregate();

        a.set(0, "大鸟");
        a.set(1, "小菜");
        a.set(2, "行李");
        a.set(3, "老外");
        a.set(4, "公交内部员工");
        a.set(5, "小偷");

        Iterator i = new ConcreteIterator(a);
        //Iterator i = new ConcreteIteratorDesc(a);
        Object item = i.First();
        while (!i.IsDone())
        {
            System.out.println(i.CurrentItem()+" 请买车票!");
            i.Next();
        }

    }

}

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

当你需要访问一个聚集对象 而且不管这些对象是什么都需要遍历的时候 你就应该考虑用迭代器模式
当你需要对聚集有多种方式遍历时 可以考虑用迭代器模式

迭代器模式就是分离了集合对象的遍历行为 抽象出一个迭代器类来负责 这样既可以做到不暴露集合的内部结构 又可让外部代码透明地访问集合内部的数据

缺点 对于比较简单的遍历 如数组 使用迭代器方式遍历较为繁琐

猜你喜欢

转载自blog.csdn.net/qq_26814945/article/details/82457868