DesignPattern - 迭代器模式行为型

Posted GitLqr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DesignPattern - 迭代器模式行为型相关的知识,希望对你有一定的参考价值。

欢迎关注微信公众号:FSA全栈行动 👋

一、迭代器模式介绍

迭代器模式(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());
    

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有android技术, 还有ios, Python等文章, 可能有你想要了解的技能知识点哦~

以上是关于DesignPattern - 迭代器模式行为型的主要内容,如果未能解决你的问题,请参考以下文章

DesignPattern - 命令模式行为型

DesignPattern - 命令模式行为型

DesignPattern - 命令模式行为型

DesignPattern - 状态模式行为型

设计模式 行为型模式 实例 -- 迭代器模式实例:迭代数组

手撸golang 行为型设计模式 迭代器模式