GoF23种设计模式之行为型模式之迭代器模式

一、概述
    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候。
2.当对聚合对象的多种遍历提供支持的时候。
3.当为了遍历不同的聚合结构提供一个统一的接口的时候(多态迭代)。
三、参与者
1.Iterator:迭代器定义访问和遍历元素的接口。
2.ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3.Aggregate:聚合定义创建相应迭代器对象的接口。
4.ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
四、类图

GoF23种设计模式之行为型模式之迭代器模式

五、示例

Iterator

[java] view plain copy
 
 print?
  1. package cn.lynn.iterator;  
  2.   
  3. public interface Iterator {  
  4.   
  5.     public void first();  
  6.   
  7.     public void last();  
  8.   
  9.     public boolean hasNext();  
  10.   
  11.     public Object next();  
  12.   
  13. }  

ConcreteIterator

[java] view plain copy
 
 print?
  1. package cn.lynn.iterator;  
  2.   
  3. public class IteratorImpl implements Iterator {  
  4.   
  5.     private List list;  
  6.   
  7.     private int index;  
  8.   
  9.     public IteratorImpl(List list) {  
  10.         index = 0;  
  11.         this.list = list;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void first() {  
  16.         index = 0;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void last() {  
  21.         index = list.getSize();  
  22.     }  
  23.   
  24.     @Override  
  25.     public boolean hasNext() {  
  26.         return index < list.getSize();  
  27.     }  
  28.   
  29.     @Override  
  30.     public Object next() {  
  31.         Object obj = list.get(index);  
  32.         index++;  
  33.         return obj;  
  34.     }  
  35.   
  36. }  

Aggregate

[java] view plain copy
 
 print?
  1. package cn.lynn.iterator;  
  2.   
  3. public interface List {  
  4.   
  5.     public Iterator iterator();  
  6.   
  7.     public Object get(int index);  
  8.   
  9.     public int getSize();  
  10.   
  11.     public void add(Object obj);  
  12.   
  13. }  

ConcreteAggregate

[java] view plain copy
 
 print?
  1. package cn.lynn.iterator;  
  2.   
  3. public class ListImpl implements List {  
  4.   
  5.     private Object[] objArr;  
  6.   
  7.     private int index;  
  8.   
  9.     private int size;  
  10.   
  11.     public ListImpl() {  
  12.         index = 0;  
  13.         size = 0;  
  14.         objArr = new Object[50];  
  15.     }  
  16.   
  17.     @Override  
  18.     public Iterator iterator() {  
  19.         return new IteratorImpl(this);  
  20.     }  
  21.   
  22.     @Override  
  23.     public Object get(int index) {  
  24.         return objArr[index];  
  25.     }  
  26.   
  27.     @Override  
  28.     public int getSize() {  
  29.         return size;  
  30.     }  
  31.   
  32.     @Override  
  33.     public void add(Object obj) {  
  34.         objArr[index++] = obj;  
  35.         size++;  
  36.     }  
  37.   
  38. }  

Client

[java] view plain copy
 
 print?
  1. package cn.lynn.iterator;  
  2.   
  3. public class Client {  
  4.   
  5.     public static void main(String[] args) {  
  6.         List list = new ListImpl();  
  7.         list.add("张三");  
  8.         list.add("李四");  
  9.         list.add("王五");  
  10.         Iterator iterator = list.iterator();  
  11.         while (iterator.hasNext()) {  
  12.             System.out.println(iterator.next());  
  13.         }  
  14.         System.out.println("********");  
  15.         for (int i = 0; i < list.getSize(); i++) {  
  16.             System.out.println(list.get(i));  
  17.         }  
  18.     }  
  19. }  

Result

[java] view plain copy
 
 print?
    1. 张三  
    2. 李四  
    3. 王五  
    4. ********  
    5. 张三  
    6. 李四  
    7. 王五