迭代器模式Iterator Pattern

迭代器模式现在已经是一个没落的设计模式了,为什么这样说呢?因为大多数语言现在已经内置了迭代器这种工具。比如Java中的Java.util.Iterator这个接口。在Java1.5之后更是增加了Java.util.Iterable。

定义:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象内部的细节。简单的说迭代器就类似于数据库中的游标,可以在一个容器内上下翻滚,遍历所有的它需要查看的元素。

迭代器是为容器服务的。

迭代器模式类图:

迭代器模式中出现的角色:

  1. Iterator抽象迭代器  :负责定义访问和遍历元素的接口,此接口中固定有三个方法:first()获得第一个元素;next()访问下一个元素;isDone()是否已经访问到了最底(在Java中叫做hasNext()方法);
  2. ConcreteIterator具体迭代器:实现抽象迭代器接口,完成遍历;
  3. Aggregate抽象容器:容器角色提供具体迭代器角色的接口,必须提供一个类似createIterator()的方法(在Java中为iterator()方法);
  4. ConcreteAggregate具体容器:实现抽象容器中的方法,创建出容纳迭代器的对象。

迭代器模式通用模板:


//抽象迭代器
public interface Iterator{
	//遍历到每一个元素
	public Object next();
	//是否已经便利到了最后一个元素
	public boolean hasNext();
	//删除当前指向的元素
	public boolean remove();
}

//具体迭代器
public class ConcreateIterator implements Iterator{
	private Vector vector=new Vector();
	//定义当前游标
	public int cursor=0;
	
	public ConcreateIterator(Vector vector) {
		super();
		this.vector = vector;
	}
	@Override
	public Object next() {
		Object result=null;
		if(this.hasNext()) {
			result=this.vector.get(this.cursor++);
		}
		else {
			result=null;
		}
		return result;
	}
	@Override
	public boolean hasNext() {
		if(this.cursor==this.vector.size()) {
			return false;
		}
		else {
			return true;
		}
	}
	@Override
	public boolean remove() {
		this.vector.remove(this.cursor);
		return true;
	}
	
}

//抽象容器
public interface Aggregate{
	//容器要增加元素
	public void add(Object object);
	//容器要减少元素
	public void remove(Object object);
	//由迭代器遍历元素
	public Iterator iterator();
}

//具体容器
public class ConcreateAggregate implements Aggregate{
	//容纳元素的容器
	private Vector vector=new Vector();

	@Override
	public void add(Object object) {
		this.vector.add(object);
		
	}

	@Override
	public void remove(Object object) {
		this.remove(object);
	}

	@Override
	public Iterator iterator() {
		return new ConcreateIterator(this.vector);
	}
	
}

//情景类
public class Client{
	public static void main(String[] args) {
		//声明容器
		Aggregate agg=new ConcreateAggregate();
		//产生对象数据放进去
		agg.add("abc");
		agg.add("def");
		agg.add("1234");
		//遍历
		Iterator it=agg.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

但在Java开发中尽量不必写迭代器,因为Java提供的Iterator就够用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值