18、行为型模式-迭代器设计模式

2021-07-25  本文已影响0人  日落_3d9f

迭代器设计模式(Iterator Pattern)

提到迭代器,想到它是与集合相关的,集合也叫容器,可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,迭代器的作用就是把容器中的对象一个一个地遍历出来

应用场景

角色

迭代器设计模式

案例需求

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

编码实战:
抽象迭代器:

public interface Iterator {
    /**
     * 获取下个元素
     * @return
     */
    Object next();
    /**
     * 是否有下一个
     * @return
     */
    boolean hasNext();
    /**
     * 删除元素
     * @param obj
     * @return
     */
    Object remove(Object obj);
}

具体的迭代器

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);
    }
}

抽象容器

public interface ICollection {
    void add(Object obj);
    void remove(Object obj);
    Iterator iterator();
}

容器简化版:

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);
    }
}

Main对象

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);
        }
    }
}

执行结果:

小滴课堂老王
小滴课堂Anna小姐姐
小滴课堂二当家小D
小滴课堂刘一手
小滴课堂老帆

优点

缺点

Java源码中List相当于抽象容器,ArrayList相当于具体容器。


ArrayList迭代实现类

点击去可以看到具体迭代器的具体实现类:


迭代器的具体实现类
上一篇 下一篇

猜你喜欢

热点阅读