迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)

定义

又称为游标模式(Cursor Pattern),它提供了一种顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。

本质:抽离集合对象迭代行为到迭代器中,提供一致访问接口。

属于行为型模式。

适用场景

  1. 访问一个集合对象的内容而无需暴露它的内部表示
  2. 为遍历不同的集合结构提供一个统一的访问接口

标准示例

在这里插入图片描述

  • 迭代器(Iterator):定义访问和遍历元素的接口,通常包含如hasNext()(判断是否有下一个元素)、next()(返回下一个元素)等方法。
  • 具体迭代器(ConcreteIterator):实现迭代器接口,对聚合对象遍历时跟踪当前位置,并能够计算出待遍历的后继对象。
  • 聚合(Aggregate):定义创建相应迭代器对象的接口。
  • 具体聚合(ConcreteAggregate):实现创建相应迭代器的接口,返回一个具体迭代器对象。

代码:

public interface Iterator<E>{
	boolean hasNext();
	E next();
}
public class ConcreteIterator<E> implements Iterator<E>{
	private List<E> list;
	private int cursor = 0;
	public ConcreteIterator(List<E> list){
		this.list = list;
	}

	public boolean hasNext(){
		return this.cursor < this.list.size();
	}
		
	public E next(){
		return this.list.get(this.cursor ++);
	}
}
public interface IAggregate<E>{
	boolean add(E element);
	boolean remove(E element);
	Iterator<E> iterator();
}
public class ConcreteAggregate<E> implements IAggregate<E>{
	private List<E> list = new Arraylist<E>();
	
	public boolean add(E element){
		return this.list.add(element);
	}
	public boolean remove(E element){
		return this.list.remove(element);
	}
	public Iterator<E> iterator(){
		return new ConcreteIterator<E>(this.list);
	}
}
public class Test {
    public static void main(String[] args) {
        IAggregate<String> aggregate = new ConcreteAggregate<String>();
        aggregate.add("java");
        aggregate.add("python");
        aggregate.add("javascript");

        Iterator<String> iterator = aggregate.iterator();

        while(iterator.hasNext()){
            String element = iterator.next();
            System.out.println(element);
        }
    }
}

输出结果:

java
python
javascript

相关推荐

  1. ·模式

    2024-07-13 09:32:03       47 阅读
  2. 模式

    2024-07-13 09:32:03       30 阅读
  3. 模式(Iterator)

    2024-07-13 09:32:03       57 阅读
  4. [go] 模式

    2024-07-13 09:32:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 09:32:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 09:32:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 09:32:03       57 阅读
  4. Python语言-面向对象

    2024-07-13 09:32:03       68 阅读

热门阅读

  1. 【React Hooks原理 - useRef】

    2024-07-13 09:32:03       21 阅读
  2. web前端开发中需要注意的一些常见问题

    2024-07-13 09:32:03       23 阅读
  3. 封装图片压缩

    2024-07-13 09:32:03       21 阅读
  4. 为什么文件需要校验MD5?

    2024-07-13 09:32:03       23 阅读
  5. STL内建仿函数

    2024-07-13 09:32:03       23 阅读
  6. 开源 Wiki 系统 InfoSphere 2024.01.1 发布

    2024-07-13 09:32:03       29 阅读
  7. macOS 的电源适配器设置

    2024-07-13 09:32:03       25 阅读
  8. PTA 7-14 畅通工程之局部最小花费问题

    2024-07-13 09:32:03       27 阅读
  9. Vue单路由的独享守卫怎么设置

    2024-07-13 09:32:03       26 阅读