Iterator 迭代器模式 MD

迭代器模式

简介

Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问【委让】给外部类,使用Iterator按顺序进行遍历访问。设计模式

在程序设计中,常常有这种状况:须要从大量的数据集合中一个个地取出数据加以处理。Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,能够屏蔽汇集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。ide

Iterator模式的应用场景能够概括为知足如下几个条件:this

  • 访问容器中包含的内部对象
  • 按顺序访问


下面是一种比较经典的Iterator模式实现方案,该实现方案基于接口设计原则,设计了如下几个接口或类:spa

  • 迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集,好比提供hasNext()和next()方法。
  • 迭代器实现类:迭代器接口Iterator的实现类。能够根据具体状况加以实现。
  • 容器接口:定义基本功能以及提供相似Iterator iterator()的方法。
  • 容器实现类:容器接口的实现类。

优势设计

  • 实现功能分离,简化容器接口。让容器只实现自己的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
  • 为容器或其子容器提供了一个统一接口,一方面方便调用;另外一方面使得调用者没必要关注迭代器的实现细节。

案例

定义一个自定义的集合的功能code

 1 public interface MyList {
 2    MyIterator iterator();//自定义迭代器
 3    Object get(int index);
 4    int getSize();
 5    void add(Object obj);
 6 }
 7 public class MyListImpl implements MyList {
 8    private Object[] list;
 9    private int index;
10    private int size;
11    public MyListImpl() {
12        index = 0;
13        size = 0;
14        list = new Object[100];
15   }
16    @Override
17    public MyIterator iterator() {
18        return new MyIteratorImpl(this); //将自身的引用传给了迭代器
19   }
20    @Override
21    public Object get(int index) {
22        if (index > size - 1) throw new RuntimeException("超出边界了");
23        return list[index];
24   }
25    @Override
26    public int getSize() {
27        return this.size;
28   }
29    @Override
30    public void add(Object obj) {
31        list[index++] = obj;
32        size++;
33   }
34 }

 

迭代器。定义访问和遍历元素的接口对象

public interface MyIterator {
   Object next();
   boolean hasNext();
}
public class MyIteratorImpl implements MyIterator {
   private MyList list;//自定义集合
   private int index;
   public MyIteratorImpl(MyList list) {
       index = 0;
       this.list = list;
  }
   @Override
   public Object next() {
       Object obj = list.get(index);
       index++;
       return obj;
  }
   @Override
   public boolean hasNext() {
       return index < list.getSize();
  }
}

 

适用性blog

访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不一样的聚合结构提供一个统一的接口(即支持多态迭代)接口

public class Test {
   public static void main(String[] args) {
       MyList list = new MyListImpl();
       list.add("a");
       list.add("b");
       list.add("c");
​
       //第一种迭代方式
       for (int i = 0; i < list.getSize(); i++) {
           System.out.println(list.get(i));
      }
​
       //第二种迭代方式
       MyIterator it = list.iterator();
       while (it.hasNext()) {
           System.out.println(it.next());
      }
  }
}

 

2016-04-21get

相关文章
相关标签/搜索