zoukankan      html  css  js  c++  java
  • 设计模式之迭代器模式

    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模式主要用在当一个集合类中的元素经常变动时,而不需要改变客户端的代码。




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    GoogleMaps 之创意应用——数码照片定位
    SGI面临破产
    Google地图搜索的触角伸向月球
    说“丛林法则”
    比Google Map更加清晰的网络地图——RealBird
    Office 12眩酷界面,先睹为快
    Paypal将正式登陆中国——贝宝
    地图技术的领导者RealBird与Google Maps的无缝结合
    微软欲封杀OpenGL?
    网络地图服务究竟商机何在?
  • 原文地址:https://www.cnblogs.com/lucari/p/4608578.html
Copyright © 2011-2022 走看看