阅读 133

DesignPattern - 命令模式【行为型】

一、迭代器模式介绍

迭代器模式(Iterator Pattern)提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部实现,属于行为型模式。

  • 核心组成

    • 抽象容器(Aggregate):提供创建具体迭代器角色的接口,一般是接口,包括一个 iterator()方法,例如 java 中的 Collection 接口,List 接口,Set 接口等

    • 具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,比如 List 接口的有序列表实现 ArrayList,List 接口的链表实现 LinkedList,Set 接口的哈希列表的实现 HashSet 等

    • 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移除当前对象的方法remove()

    • 具体迭代器角色(ConcreteIterator):实现迭代器接口中定义的方法,并要记录遍历中的当前位置,完成集合的迭代

  • 应用场景

    • 一般来说,迭代器模式是与集合共存的,只要实现一个集合,就需要同时提供这个集合的迭代器,就像 java 中的 Collection、List、Set、Map 等,都有自己的迭代器

    • Java 中的 iterator 迭代器

  • 优点

    • 可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据

    • 支持以不同的方式遍历一个聚合对象

  • 缺点

    • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐

    • 迭代器模式在遍历的同时,更改迭代器所在的集合结构会导致出现异常

二、迭代器模式代码实现

下面以仿写集合 List 为例

创建 抽象迭代器:

/**  * 抽象迭代器  *  * @author GitLqr  */ public interface Iterator { // 获取下一个元素 Object next(); // 判断是否有下一个 boolean hasNext(); } 复制代码

创建 具体迭代器:

/**  * 具体迭代器  *  * @author GitLqr  */ public class MyIterator implements Iterator { private List list; private int index = 0; public MyIterator(List list) { super(); this.list = list; } @Override public Object next() { Object obj = null; if (hasNext()) { obj = list.get(index); index++; } return obj; } @Override public boolean hasNext() { return index < list.size(); } } 复制代码

创建 抽象容器:

/**  * 抽象容器  *  * @author GitLqr  */ public interface ICollection { void add(Object object); void remove(Object object); Iterator iterator(); } 复制代码

创建具体容器:

/**  * 具体容器  *  * @author GitLqr  */ public class MyCollection implements ICollection { private List list = new ArrayList<>(); @Override public void add(Object object) { list.add(object); } @Override public void remove(Object object) { list.remove(object); } @Override public Iterator iterator() { return new MyIterator(list); } } 复制代码

使用:

public static void main(String[] args) {     ICollection collection = new MyCollection();     collection.add("Apple");     collection.add("Banana");     collection.add("Pear");     Iterator iterator = collection.iterator();     while (iterator.hasNext()) {         System.out.println(iterator.next());     } }


作者:GitLqr
链接:https://juejin.cn/post/7035653960476131364

 伪原创工具 SEO网站优化  https://www.237it.com/


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐