• 设计模式之迭代器模式


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




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

  • 相关阅读:
    qt运行时连接signal和slot
    linux使用usb转串口调试ARM开发板
    qwt自定义时间标尺TimeScale
    关于mysql 导入大型数据问题的解决(转载,出处以忘)
    JavaScript replace(RegExp, Function)详解
    有关高度和宽度的对象
    前自增和后自增(chrome js 为了保险,还没测过其它的)
    JavaScript效率PK——统计特定字符在字符串中出现的次数
    getStyle函数
    解决CHM文件在WIN7下崩溃和自动生成CHW文件的问题
  • 原文地址:https://www.cnblogs.com/lucari/p/4608578.html
Copyright © 2020-2023  润新知