GOF23设计模式-行为型模式2-迭代器模式(Iterator)

GOF23设计模式-迭代器模式

定义

提供一种遍历聚合对象的方式,而又不暴露该对象的内部表示。

  • 聚合对象:存储数据
  • 迭代器:遍历数据

当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就需要考虑用迭代器模式,为遍历不同的聚合结构提供如第一个、下一个、是否结束、当前哪一个等统一的接口。

结构图

在这里插入图片描述

代码实现

  1. 定义迭代器接口MyIterator.java
/**
 * User:tumbler
 * Desc:迭代器模式--迭代器接口
 *      定义获取第一个、下一个、是否有下一个元素、当前元素等方法
 */
public interface MyIterator {

    /**
     * 将游标指向第一个元素
     */
    void first();
    /**
     * 将游标指向第下一个元素
     */
    void next();

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

    boolean isFirst();
    boolean isLast();

    /**
     * 获取当前元素
     * @return
     */
    Object getCurrentObj();
}
  1. 自定义聚合类ConcreteMyAggregate.java ,使用内部类实现迭代器
/**
 * User:tumbler
 * Desc:迭代器模式--自定义聚合类,使用内部类实现迭代器
 */
public class ConcreteMyAggregate {

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

    public void addObject(Object obj) {
        this.list.add(obj);
    }

    public void removeObject(Object obj) {
        this.list.remove(obj);
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    /**
     * 获得迭代器
     * @return
     */
    public ConcreteIterator createIterator() {
        return new ConcreteIterator();
    }

    /**
     * 使用内部类定义迭代器,可以直接使用外部类的属性
     */
    protected class ConcreteIterator implements MyIterator{

        /**
         * 定义游标,用于记录遍历时的位置
         */
        private int cursor;

        @Override
        public void first() {
            cursor = 0;
        }

        @Override
        public void next() {
            if (hasNext()){
                cursor++;
            }
        }

        @Override
        public boolean hasNext() {
            return cursor < list.size();
        }

        @Override
        public boolean isFirst() {
            return cursor == 0;
        }

        @Override
        public boolean isLast() {
            return cursor == (list.size() - 1);
        }

        @Override
        public Object getCurrentObj() {
            return list.get(cursor);
        }
    }

}
  1. 测试迭代器Client.java
/**
 * User:tumbler
 * Desc:迭代器模式--测试类
 */
public class Client {
    public static void main(String[] args) {
        ConcreteMyAggregate cma = new ConcreteMyAggregate();
        cma.addObject("aa");
        cma.addObject("bb");
        cma.addObject("cc");

        //获得迭代器进行遍历
        MyIterator iter = cma.createIterator();
        while (iter.hasNext()) {
            System.out.println(iter.getCurrentObj());
            iter.next();
        }
    }
}

运行结果:

aa
bb
cc
  1. UML图
    在这里插入图片描述

开发常见应用

  • JDK内置的迭代器(List/Set)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值