【设计模式】—— 迭代模式Iterator

来源:互联网 发布:asp.net 微信商城源码 编辑:程序博客网 时间:2024/05/20 13:13

模式意图

提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示。

 应用场景

1 访问一个聚合的对象,而不需要暴露对象的内部表示

2 支持对聚合对象的多种遍历

3 对遍历不同的对象,提供统一的接口。

模式结构


Iterator 定义访问的接口

/** * 抽象的迭代,有判断结束和下一个,获取当前元素等函数 * @author xingoo * */interface Iterator{    void first();    void next();    boolean isDone();    Object currentItem();}

ConcreteIterator 具体的迭代器,跟踪聚合内的元素

/** * 具体的迭代类 * @author xingoo * */class ConcreteIterator implements Iterator{    private ConreteAggregate agg;    private int index = 0;    private int size = 0;        public ConcreteIterator(ConreteAggregate agg) {        this.agg = agg;        size = agg.size();        index = 0;    }    public void first() {        index = 0;    }    public void next() {        if(index < size){            index++;        }    }    public boolean isDone() {        return (index >= size);    }    public Object currentItem() {        return agg.getElement(index);    }    }

Aggregate 提供聚合的接口

/** * 聚合的类 * @author xingoo * */abstract class Aggregate{    public Iterator createIterator(){        return null;    }}

ConcreteAggregate 具体的聚合

/** * 具体的聚合对象,拥有大小,创建迭代子等函数 * @author xingoo * */class ConreteAggregate extends Aggregate{    private Object[] obj = {"test1","test2","test3","test4"};    public Iterator createIterator(){        return new ConcreteIterator(this);    }    public Object getElement(int index){        if(index < obj.length){            return obj[index];        }else{            return null;        }    }    public int size(){        return obj.length;    }}

全部代码

 1 package com.xingoo.Iterator; 2 /** 3  * 聚合的类 4  * @author xingoo 5  * 6  */ 7 abstract class Aggregate{ 8     public Iterator createIterator(){ 9         return null;10     }11 }12 /**13  * 抽象的迭代,有判断结束和下一个,获取当前元素等函数14  * @author xingoo15  *16  */17 interface Iterator{18     void first();19     void next();20     boolean isDone();21     Object currentItem();22 }23 /**24  * 具体的聚合对象,拥有大小,创建迭代子等函数25  * @author xingoo26  *27  */28 class ConreteAggregate extends Aggregate{29     private Object[] obj = {"test1","test2","test3","test4"};30     public Iterator createIterator(){31         return new ConcreteIterator(this);32     }33     public Object getElement(int index){34         if(index < obj.length){35             return obj[index];36         }else{37             return null;38         }39     }40     public int size(){41         return obj.length;42     }43 }44 /**45  * 具体的迭代类46  * @author xingoo47  *48  */49 class ConcreteIterator implements Iterator{50     private ConreteAggregate agg;51     private int index = 0;52     private int size = 0;53     54     public ConcreteIterator(ConreteAggregate agg) {55         this.agg = agg;56         size = agg.size();57         index = 0;58     }59 60     public void first() {61         index = 0;62     }63 64     public void next() {65         if(index < size){66             index++;67         }68     }69 70     public boolean isDone() {71         return (index >= size);72     }73 74     public Object currentItem() {75         return agg.getElement(index);76     }77     78 }79 /**80  * 客户端 使用方法81  * @author xingoo82  *83  */84 public class Client {85     private Iterator it;86     private Aggregate agg = new ConreteAggregate();87     public void operation(){88         it = agg.createIterator();89         while(!it.isDone()){90             System.out.println(it.currentItem().toString());91             it.next();92         }93     }94     public static void main(String[] args) {95         Client client = new Client();96         client.operation();97     }98 }

运行结果

test1test2test3test4


原创粉丝点击