设计模式学习笔记(十三)—Iterator迭代器模式

    技术2022-05-11  3

     

    Iterator模式定义:

      提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。

      这个模式在java的类库中已经实现了,在java中所有的集合类都实现了Conllection接口,而Conllection接口又继承了Iterable接口,该接口有一个iterator方法,也就是所以的集合类都可以通过这个iterator方法来转换成Iterator类,用Iterator对象中的hasnext方法来判断是否还有下个元素,next方法来顺序获取集合类中的对象。今天面试考到设计模式,我愣是没答上来,我晕死,自己这几天刚学的东西,自己也都理解,可一到考试的时候不是忘了就是回答的不准确,自己也不清楚到底是为什么,哎,伤心。。。。。。,下面是Iterator模式的结构图:

      在这个结构图中的Aggregate抽象类也可以定义成接口。下面给出一个例子来说明Iterator模式的使用。

    import java.util.ArrayList;    interface Iterator<E>{ public void first(); public void next(); public E currentItem(); public boolean isDone(); } class ConcreteIterator<E> implements Iterator<E>{    private ConcreteAggregate<E> agg; private int index=0; private int size=0;      public ConcreteIterator( ConcreteAggregate<E> aggregate) {  this.agg=aggregate;  this.index=0;  this.size=aggregate.size(); }    public E currentItem() {  return agg.getElement(index); }    public void first() {  index=0; }    public boolean isDone() {  if(index>=size){  return true;  }  return false; }    public void next() {  if(index<size){  index++;    }   } } abstract class Aggregate<E>{ protected abstract Iterator createIterator(); } class ConcreteAggregate<E> extends Aggregate<E>{ private ArrayList<E> arrayList=new ArrayList<E>(); public Iterator createIterator() {    return new ConcreteIterator<E>(this); } public void add(E o){  arrayList.add(o); } public E getElement(int index) {        if (index<arrayList.size()) {         return arrayList.get(index);        } else {         return null;        }      }      public int size(){        return arrayList.size();      }    }    public class Client {    public static void main(String[] args) {  ConcreteAggregate<String> aggregate=new ConcreteAggregate<String>();  aggregate.add("A");  aggregate.add("B");  aggregate.add("C");  aggregate.add("D");  aggregate.add("E");  Iterator iterator=aggregate.createIterator();  for(iterator.first();!iterator.isDone();iterator.next()){  System.out.println(iterator.currentItem());  }   } } 

    输出结果:

      A

      B

      C

      D

      E

      在这个例子中,我们按照Iterator模式的结构图来创建的例子,我们创建的集合ConcreteAggregate可以存放任何类型的数据,然后使用createIterator方法转换成Iterator对象,使用Iterator对象来按顺序显示集合中的内容。这个模式在Java的jdk中是这样实现的,所以的集合类都实现了Iterable接口,这个接口中有一个iterator方法可以把集合类的对象转换成Iterator类的对象。明白这个原理可以更好的理解Java中的集合类和迭代器,根据这个可以创建功能更加强大的集合类。

      小结:Iterator模式主要用在当一个集合类中的元素经常变动时,而不需要改变客户端的代码。

     


    最新回复(0)