设计模式-行为型模式-迭代器模式 Iterator

设计模式-行为型模式-迭代器模式 Iterator

1.简介

用于容器和容器遍历;容器可以是数组,列表,集合 或者其他的容器型数据结构

迭代器模式提供一种顺序遍历聚合对象元素而不暴露其内部实现方式的方法;

2.角色

在这里插入图片描述

  • Container/Aggregate : 容器类接口
  • ConcreteContainer/ConcreteAggregate :具体容器类的实现类,暴露方法创建迭代器
  • Iterator:迭代器接口,具有通用方法,hasNext();next()
  • ConcreteIterator:一般容器内部会实现自己的迭代器,基于Iterator 接口

3.场景

Java 版本中的java.util.Collection 和 java.util.Iterator 接口

4.模拟写个例子

4.1.容器和迭代器接口

//Container/Aggregate : 容器类接口
interface ICollection<E> extends IIterable<E> {

	void add(E e);

	E get(int index);

}

//Iterator:迭代器接口
interface IIterator<E> {

	boolean hasNext();

	E next();

}

//这个接口 用于每个集合的实现类都用方法返回一个迭代器
interface IIterable<E> {

	IIterator<E> iterator();
}

4.2.具体容器,具体迭代器(1)

// ConcreteContainer/ConcreteAggregate :具体容器类的实现类,暴露方法创建迭代器
class IArrayList<E> implements ICollection<E> {

	private Object[] elements;
	private int eIndex = 0;

	public IArrayList() {
		this.elements = new Object[5];
	}

	@Override
	public void add(E e) {
		if (eIndex == (elements.length)) {
			Object[] elementsNew = new Object[elements.length + (elements.length >> 1)];
			System.arraycopy(elements, 0, elementsNew, 0, elements.length);
			elements = elementsNew;
		}
		elements[eIndex] = e;
		eIndex++;
	}

	@Override
	public E get(int index) {
		return (E) elements[index];
	}
//暴露方法创建迭代器
	@Override
	public IIterator<E> iterator() {
		return new IArrayListIterator();
	}
//ConcreteIterator:一般容器内部会实现自己的迭代器,基于Iterator 接口
	class IArrayListIterator<E> implements IIterator<E> {

		private int eachIndex = 0;

		@Override
		public boolean hasNext() {
			return eachIndex < eIndex;
		}

		@Override
		public E next() {
			E element = (E) elements[eachIndex];
			eachIndex++;
			return element;
		}
	}
}

4.3.具体容器,具体迭代器(2)

 ConcreteContainer/ConcreteAggregate :具体容器类的实现类,暴露方法创建迭代器
class ILinkedList<E> implements ICollection<E> {

	private Node<E> head;
	private Node<E> tail;
	int size = 0;

	@Override
	public void add(E e) {

		Node<E> node = new Node<>();
		node.e = e;
		if (size == 0) {
			head = node;
		} else {
			node.pre = tail;
			tail.next = node;
		}
		tail = node;
		size++;
	}

	@Override
	public E get(int index) {
		if (index == 0) {
			return head.e;
		}
		Node<E> node = head;
		for (int i = 0; i < index; i++) {
			node = node.next;
		}
		return node.e;
	}
//暴露方法创建迭代器
	@Override
	public IIterator<E> iterator() {
		return new ILinkedListIterator();
	}
//ConcreteIterator:一般容器内部会实现自己的迭代器,基于Iterator 接口
	class ILinkedListIterator implements IIterator<E> {

		private int eachIndex = 0;

		@Override
		public boolean hasNext() {
			return eachIndex < size;
		}

		@Override
		public E next() {
			if (eachIndex == 0) {
				eachIndex++;
				return head.e;
			}
			Node<E> node = head;
			for (int i = 0; i < eachIndex; i++) {
				node = node.next;
			}
			eachIndex++;
			return node.e;
		}
	}

	class Node<E> {
		public Node<E> next;
		public Node<E> pre;
		public E e;
	}
}

4.4.客户端测试代码

	public static void main(String[] args) {

		ICollection<Integer> collection = new IArrayList<>();
		ICollection<Integer> collection2 = new ILinkedList<>();
        //填充数据
		for (int i = 0; i < 10; i++) {
			collection.add(i + 100);
			collection2.add(i * 2);
		}
		//通用遍历
		for (int i = 0; i < 10; i++) {
			Integer integer = collection.get(i);
			System.out.println("collection  index value :" + integer);
		}
		for (int i = 0; i < 10; i++) {
			Integer integer = collection2.get(i);
			System.out.println("collection2  index value :" + integer);
		}

        //迭代器遍历
		IIterator<Integer> iterator = collection.iterator();
		while (iterator.hasNext()) {
			Integer next = iterator.next();
			System.out.println("iterator collection  index value :" + next);
		}

		IIterator<Integer> iterator2 = collection2.iterator();
		while (iterator2.hasNext()) {
			Integer next = iterator2.next();
			System.out.println("iterator2 collection  index value :" + next);
		}
	}

测试结果

collection  index value :100
collection  index value :101
collection  index value :102
collection  index value :103
collection  index value :104
collection  index value :105
collection  index value :106
collection  index value :107
collection  index value :108
collection  index value :109
collection2  index value :0
collection2  index value :2
collection2  index value :4
collection2  index value :6
collection2  index value :8
collection2  index value :10
collection2  index value :12
collection2  index value :14
collection2  index value :16
collection2  index value :18
iterator collection  index value :100
iterator collection  index value :101
iterator collection  index value :102
iterator collection  index value :103
iterator collection  index value :104
iterator collection  index value :105
iterator collection  index value :106
iterator collection  index value :107
iterator collection  index value :108
iterator collection  index value :109
iterator2 collection  index value :0
iterator2 collection  index value :2
iterator2 collection  index value :4
iterator2 collection  index value :6
iterator2 collection  index value :8
iterator2 collection  index value :10
iterator2 collection  index value :12
iterator2 collection  index value :14
iterator2 collection  index value :16
iterator2 collection  index value :18
Disconnected from the target VM, address: '127.0.0.1:51888', transport: 'socket'

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值