IteratorPattern迭代器设计模式介绍和应用场景

DBC 676 0

迭代器设计模式(Iterator Pattern)

  • 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部实现,属于行为型模式
  • 应该是java中应用最多的设计模式之一
提到迭代器,想到它是与集合相关的,集合也叫容器,可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,迭代器的作用就是把容器中的对象一个一个地遍历出来
  • 应用场景
    • 一般来说,迭代器模式是与集合是共存的,只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等 都有自己的迭代器
    • JAVA 中的 iterator迭代器

 

  • 角色
    • 抽象容器(Aggregate):提供创建具体迭代器角色的接口,一般是接口,包括一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
    • 具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList, Set接口的哈希列表的实现HashSet等。
    • 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移除当前对象的方法remove()
    • 具体迭代器角色(ConcreteIterator):实现迭代器接口中定义的方法,并要记录遍历中的当前位置,完成集合的迭代
  • IteratorPattern迭代器设计模式介绍和应用场景插图

案例需求

自定义一个集合容器,并实现里面的迭代器功能,List集合容器的简化版本

小例子——先看结构图IteratorPattern迭代器设计模式介绍和应用场景插图2
/**
 * @Description 具体的迭代器
 **/

public class ConcreteIterator implements Iterator {

    private List list;

    private int index = 0;

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


    @Override
    public Object next() {

        Object obj = null;
        if(this.hasNext()){
            obj = this.list.get(index);
            index++;
        }
        return obj;
    }

    @Override
    public boolean hasNext() {
        if(index == list.size()){
            return false;
        }
        return true;
    }

    @Override
    public Object remove(Object obj) {
        return list.remove(obj);
    }
}
/**
 * @Description 抽象容器建立了
 **/

public interface ICollection {

    void add(Object obj);

    void remove(Object obj);

    Iterator iterator();
}
/**
 * @Description 抽象迭代器
 **/

public interface Iterator {

    /**
     * 获取下个元素
     * @return
     */
    Object next();


    /**
     * 是否有下一个
     * @return
     */
    boolean hasNext();


    /**
     * 删除元素
     * @param obj
     * @return
     */
    Object remove(Object obj);

}
/**
 * @Description  容器简化版
 **/

public class MyCollection implements ICollection {

    private List list  = new ArrayList();

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

    @Override
    public void remove(Object obj) {

        list.remove(obj);
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(list);
    }
}
public class Main {

    public static void main(String[] args) {


        ICollection collection = new MyCollection();

        collection.add("小滴课堂老王");
        collection.add("小滴课堂Anna小姐姐");
        collection.add("小滴课堂二当家小D");
        collection.add("小滴课堂刘一手");
        collection.add("小滴课堂老帆");

        Iterator iterator = collection.iterator();

        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }



    }
}
控制台输出——IteratorPattern迭代器设计模式介绍和应用场景插图4
  • 优点
    • 可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
    • 支持以不同的方式遍历一个聚合对象
  • 缺点
    • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
    • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常

 

  • JDK源码 ArrayList的迭代器例子
  • IteratorPattern迭代器设计模式介绍和应用场景插图6

发表评论 取消回复
表情 图片 链接 代码

分享