【Java设计模式】- 迭代器模式

概述

迭代器模式它可以让用户通过一个迭代器的接口去迭代访问容器中的每一个元素而不用去关心容器内部数据的具体数据结构及实现。

优点:符合面向对象原则,将迭代的功能交给单一的迭代器去完成,同时使得容器可以拥有不同的迭代方式。
缺点:增加了系统的复杂性。

实现


迭代器模式的类图



通过一个抽象的迭代器接口去定义了迭代器的行为,同时抽象容器对象也为容器提供返回迭代器接口的方法。

简单实现

这里模仿ArrayList去简单的实现一个MyArrayList。自定义Iterator接口和抽象容器(直接使用Collection的话里面定义的内容比较多比较繁杂)

Iterator接口:
public interface Iterator <E> {
	
	boolean hasNext();
	
	Object next();
	
}
first方法就暂时不定义了。主要实现迭代的功能


抽象容器:

public abstract class MyCollection <E> {
	
	abstract int size();
	
	abstract Iterator<E> iterator();
	
	abstract E get(int index);
	
	abstract void add(E e);
}

定义了基本的方法。

实现:
public class MyArrayList<E> extends MyCollection<E> {

	private Object[] data;
	
	private int size;
	
	public MyArrayList(int cap){
		this.data = new Object[cap];
	}
	
	@Override
	public int size() {
		return size;
	}

	@Override
	public Iterator<E> iterator() {
		 
		return new MyIterator();
	}

	@SuppressWarnings("unchecked")
	@Override
	public E get(int index) {
		if (index < 0 || index > size())
			throw new IllegalArgumentException();
		return (E) data[index];
	}

	@Override
	public void add(Object e) {
		if (size == data.length)
			resize();
		data[size] = e;
		++size;
	}

	private void resize() {
		Object[] newData = new Object[data.length << 1];
		System.arraycopy(data, 0, newData, 0, data.length);
		data = newData;
	}

	private class MyIterator implements Iterator<E> {

		private int cursor;
		
		@Override
		public boolean hasNext() {
			return cursor != size;
		}

		@Override
		public Object next() {
			if (cursor >= size)
				return new NoSuchElementException();
			return data[cursor++];
		}
		
	}
}

定义了一个私有的内部类去实现了Iterator'接口并通过iterator方法返回该接口的实例。

使用:

public class Test {
	public static void main(String[] args) {
		MyArrayList<Integer> list = new MyArrayList<>(10);
		for (int i = 0; i < 10; i ++)
			list.add(i);
		
		for (Iterator<Integer> it = list.iterator(); it.hasNext();)
			System.out.println(it.next());
	}
}

输出:
0
1
2
3
4
5
6
7
8
9








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值