迭代器模式

  迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象的内部表示。

迭代器抽象类:

 1 package iterrator;
 2 
 3 public abstract class Iterator {
 4     public abstract Object first();
 5 
 6     public abstract Object next();
 7 
 8     public abstract boolean isDone();
 9 
10     public abstract Object currentItem();
11 }

聚合对象抽象类:

1 public abstract class Aggregate {
2     public abstract Iterator createIterator();
3 }

具体迭代器类

public class ConcreteIterator extends Iterator{
    
    private ConcreteAggregate aggregate;
    private int current = 0;
    
    public ConcreteIterator(ConcreteAggregate aggregate){
        this.aggregate = aggregate;
    }
    
    @Override
    public Object first() {
        return aggregate.getItems().get(0);
    }

    @Override
    public Object next() {
        Object ret = null;
        current++;
        List<Object> items = aggregate.getItems();
        if(current < items.size()){
            ret = items.get(current);
        }
        return ret;
    }

    @Override
    public boolean isDone() {
        return (current>=aggregate.getItems().size())?true:false;
    }

    @Override
    public Object currentItem() {
        return aggregate.getItems().get(current);
    }
    
}

具体聚合类:

 1 public class ConcreteAggregate extends Aggregate{
 2     
 3     private List<Object> items = new ArrayList<Object>();
 4 
 5     @Override
 6     public Iterator createIterator() {
 7         return new ConcreteIterator(this);
 8     }
 9     
10     public int count(){
11         return items.size();
12     }
13     
14     public Object getThis(int index){
15         return items.get(index);
16     }
17 
18     public List<Object> getItems() {
19         return items;
20     }
21 
22     public void setItems(List<Object> items) {
23         this.items = items;
24     }
25     
26 }

客户端调用:

public class MainClass {
    public static void main(String[] args) {
        ConcreteAggregate a = new ConcreteAggregate();
        
        a.getItems().add("A");
        a.getItems().add("B");
        a.getItems().add("C");
        a.getItems().add("D");
        a.getItems().add("E");
        a.getItems().add("F");
        
        Iterator i = new ConcreteIterator(a);
        
        Object item = i.first();
        
        while(!i.isDone()){
            System.out.println(i.currentItem()+"请买票");
            i.next();
        }
        
    }
}

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。

posted @ 2012-11-01 15:16  寒剑飘香  阅读(127)  评论(0编辑  收藏  举报