设计模式-迭代模式

UML类图

在这里插入图片描述

使用场景

用来遍历集合或聚合对象,通常是为了统一遍历方式。如List集合的Iterator遍历,接下来将实现一个简易版的List集合和Iterator。

代码实现

迭代器抽象

public interface Iterator<E> {
	public E first();
	public E next();
	public boolean hasNext();
	public E currentItem();
}

聚合抽象,这里模拟Java中的List集合

public interface List<E> {
	public void add(E e);
	public E remove(int i);
	public E get(int i);
	public int size();
	public Iterator<E> iterator();
}

具体聚合类,这里模拟Java中的ArrayList集合

import java.util.Arrays;
/**
 * 简易版List容器
 * @param <E> 容器中的元素
 */
public class ArrayList<E> implements List<E> {
	private Object[] elements;
    private static final Object[] EMPTY_ELEMENTDATA = {};	
    private int size;
    public ArrayList(){
    	this.elements = EMPTY_ELEMENTDATA;
    	this.size = elements.length;
    }
	@Override
	public void add(E e) {
		if(elements.length - size == 0)elements = Arrays.copyOf(elements, this.size+1);	//将elements元素复制到一个新数组,并将容量+1,最后又返回给elements数组
		elements[size ++] = e;
	}

	@Override
	public E remove(int i) {
		if(this.size == 0 || i>=size){
			throw new IndexOutOfBoundsException("当前集合为空,无法移除元素");
		}
		E oldValue = get(i);
		int numMoved = this.size - i - 1;	//删除i位置的元素后,需向前移动元素的个数
		if(numMoved > 0){
			System.arraycopy(elements, i+1, elements, i, numMoved);	//将elements数组中第i+1个位置后的numMoved个元素移动到i位置
		}
		elements[--size] = null;	//GC清理
		return oldValue;
	}

	@SuppressWarnings("unchecked")
	@Override
	public E get(int i) {
		if(this.size == 0 || i>=size){
			throw new IndexOutOfBoundsException("下标越界");
		}
		return (E)elements[i];
	}
	@Override
	public int size() {
		return this.size;
	}
	
	public Iterator<E> iterator(){
		return new Itr();
	}
	
	//迭代器
	private class Itr implements Iterator<E>{
		private int cursor = 0;
		@Override
		public E first() {
			if(size == 0){
				return null;
			}
			return get(0);
		}
		@Override
		public E next() {
			if(++cursor < size){
				return get(cursor);
			}
			return null;
		}
		@Override
		public boolean hasNext() {
			return cursor != size;
		}
		@Override
		public E currentItem() {
			return get(cursor);
		}
	}
}

客户端实现

public class Client {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.remove(0);
		
		for(Iterator<String> it = list.iterator();it.hasNext();){
			System.out.println(it.next());
		}
	}
}

输出结果
b
c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值