迭代器设计模式(行为型设计模式)

一、迭代器设计模式简介

迭代器设计模式(Iterator Pattern)

  • 提供⼀种⽅法顺序访问⼀个聚合对象中各个元素, ⽽⼜⽆须暴露该对象的内部实现,属于⾏为型模式 应该是java中应⽤最多的设计模式之⼀

应用场景

  • ⼀般来说,迭代器模式是与集合是共存的,只要实现⼀个集合,就需要同时提供这个集合的迭代器,就像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):实现迭代器接⼝中定义的⽅法,并要记录遍历中的当前位置,完成集合的迭代

二、优缺点 

优点:

  • 可以做到不暴露集合的内部结构,⼜可让外部代码透明地访问集合内部的数据
  • ⽀持以不同的⽅式遍历⼀个聚合对象

缺点:

  • 对于⽐较简单的遍历(像数组或者有序列表),使⽤迭代器⽅式遍历较为繁琐
  • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常 

三、代码实现 

/**
 * 抽象迭代器
 */
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;
    }
    /**
     * 获取下一个元素
     * @return
     */
    @Override
    public Object next() {
        Object o = null;
        if(this.hasNext()){
            o = this.list.get(index);
            index++;
        }
        return o;
    }
    /**
     * 是否有下一个
     * @return
     */
    @Override
    public boolean hasNext() {
        if(index == this.list.size()){
           return false;
        }
        return true;
    }
    /**
     * 删除元素
     * @param obj
     * @return
     */
    @Override
    public Object remove(Object obj) {
        return this.list.remove(obj);
    }
}
/**
 * 抽象容器
 */
public interface ICollection {
    /**
     * 链式调用
     */
    ICollection add(Object obj);
    void remove(Object obj);
    Iterator iterator();
}
/**
 * 具体容器
 */
public class ConcreteCollection implements ICollection{
    private List list = new ArrayList();
    @Override
    public ICollection add(Object obj) {
        list.add(obj);
        return this;
    }

    @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) {
        ConcreteCollection cc = new ConcreteCollection();
        cc.add("李白").add("小明").add("杜甫").add("白居易").add("高楼");
        Iterator iterator = cc.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

注释:个人学习观点以作笔记,如有瑕疵望谅解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值