`
xieyaxiong
  • 浏览: 38982 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

design pattern——迭代器模式

 
阅读更多

针对问题:提供统一接口访问集合,屏蔽集合内部数据的访问和数据结构。提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。

 

 

 

 

 

迭代器模式的结构图:

 


 

 

 

 

迭代器模式的实现代码:

 

/**
 * 迭代接口
 * @author bruce
 *
 */
public interface Iterator {
	
	public Object first();
	
	public Object next();
	
	public boolean isDone();
	
	public Object currentItme();

}




/**
 * 集合抽象类
 * @author bruce
 *
 */
public abstract class Aggregate {
	
	public abstract Iterator createIterator();

}





/**
 * 集合实现类
 * @author bruce
 *
 */
public class ConcreteAggregate extends Aggregate{
	
	private Object[] objects;
	
	public ConcreteAggregate(Object[] objects){
		this.objects=objects;
	}

	@Override
	public Iterator createIterator() {
		return new ConcreteIterator(this);
	}
	
	/**
	 * 迭代器应作为集合类的私有内部类来实现。这样可以访问集合,不需要以下接口。
	 * @return
	 */
	public Object[] getObjects(){
		return objects;
	}
	
}





/**
 * 迭代器实现
 * @author bruce
 *
 */
public class ConcreteIterator implements Iterator{
	
	private ConcreteAggregate aggregate;
	
	private int current=0;
	
	public ConcreteIterator(ConcreteAggregate aggregate){
		this.aggregate=aggregate;
	}

	public Object currentItme() {
		return getObjects()!=null && getObjects().length>current?getObjects()[current]:null;
	} 

	public Object first() {
		return getObjects()!=null && getObjects().length>0?getObjects()[0]:null;
	}

	public boolean isDone() {
		return getObjects()!=null && getObjects().length>0?current>=getObjects().length:true;
	}

	public Object next() {
		// TODO Auto-generated method stub
		return isDone()?null:getObjects()[current++];
	}
	
	
	/**
	 * 迭代器应该实现在集合内部,不需要些接口
	 * @return
	 */
	private Object[] getObjects(){
		return aggregate.getObjects();
	}
	
}






/**
 * 测试类
 * @author bruce
 *
 */
public class Client {
	
	public static void main(String[] args) {
		Object[] objects=new Object[]{"A","B","C"};
		
		ConcreteAggregate aggregate=new ConcreteAggregate(objects);
		Iterator iterator=aggregate.createIterator();
		while(!iterator.isDone()){
			Object object=iterator.next();
			System.out.println(object);
		}
		/**
		 * output:
		   A
		   B
		   C

		 */
	}

}
 

 

 

 

  • 大小: 6.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics