设计模式-迭代器模式


迭代器模式的定义

*迭代器(Iterator)模式: * 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示,迭代器模式是一种对象行为型模式

  • Java Collection都使用了迭代器

特点

1. 优点

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 遍历任务交由迭代器完成,这简化了聚合类
  • 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历
  • 增加新的聚合类和迭代器类都很方便,无序修改原有代码
  • 封装性良好,为遍历不同的聚合结构提供一个统一的接口

2. 缺点

  • 增加了类的个数,一定程度上增加了系统的复杂性

模式的结构与实现

1. 模式的结构

  • 抽象聚合(Aggregate)角色: 定义存储、添加、删除聚合对象以及创建迭代器对象的接口

  • 具体聚合(ConcreteAggregate)角色: 实现抽象聚合类,返回一个具体迭代器的实例

  • 抽象迭代器(Iterator)角色: 定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法

  • 具体迭代器(Concretelterator)角色: 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置

    迭代器模式结构图

2. 模式的实现

/**
 * 迭代器模式
 * java中已经有迭代器相关接口Iterator与Iterable
 * 推荐Iterable(可以返回Iterator,Spliterator,支持forEach)
 */
//抽象聚合
interface Aggregate<T>{
    void add(T t);
    void remove(T t);
    Iterator<T> getIterator();
    Iterable<T> getAll();
}
//具体聚合
class ConcreteAggregate<T> implements Aggregate<T>{
    private List<T> list = new ArrayList<>();
    @Override
    public void add(T t) {
        list.add(t);
    }
    @Override
    public void remove(T t) {
        list.remove(t);
    }
    @Override
    public Iterable<T> getAll() {
        return Collections.unmodifiableList(list);  //返回不可修改的list
    }
    //返回迭代器对象
    @Override
    public Iterator<T> getIterator() {
        return new ConcreteIterator<>();
    }
    //具体自定义迭代器:实现Iterator接口
    class ConcreteIterator<T> implements Iterator<T>{
        private int index = -1;
        @Override
        public boolean hasNext() {
            if(index < list.size()-1) return true;
            else return false;
        }

        @Override
        public T next() {
            T t = null;
            if(hasNext()) t = (T)list.get(++index);
            return t;
        }
    }
}

//测试
public class IteratorPattern {
    public static void main(String[] args) {
        Aggregate<Integer> ag=new ConcreteAggregate<>();
        ag.add(1);
        ag.add(2);
        ag.add(3);
        System.out.print("Iterator:");
        Iterator<Integer> it=ag.getIterator();
        while(it.hasNext()) {
            Object ob=it.next();
            System.out.print(ob.toString());
        }
        System.out.print("\tIterable:");
        ag.getAll().forEach(System.out::print);
    }
}

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
设计模式-访问者模式 设计模式-访问者模式
访问者模式的定义 *访问者(Visitor)模式: * 将作用与某种数据结构中的各个元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式,他将对数据的操作与数
2020-05-11
下一篇 
设计模式-中介者模式 设计模式-中介者模式
中介者模式的定义 *中介者(Mediator)模式: * 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变他们之间的交互,中介者模式又叫调停模式,是迪米特法则的典型应用 特点1. 优点 降低了对象之间
2020-05-08
  目录