迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的具体细节。

实现:

假设,有个菜单,里面包含菜单项,如下

 

  1. package com.zlh.iterator; 
  2.  
  3. public class BreakfastMenu { 
  4.     private MenuItem[] items; 
  5.  
  6.     public MenuItem[] getItems() { 
  7.         return items; 
  8.     } 
  9.  
  10.     public void setItems(MenuItem[] items) { 
  11.         this.items = items; 
  12.     } 
  13.      
  14.     public BreakfastMenu() { 
  15.         items = new MenuItem[5]; 
  16.         items[0] = new MenuItem("1",1); 
  17.         items[1] = new MenuItem("2",2); 
  18.         items[2] = new MenuItem("3",3); 
  19.         items[3] = new MenuItem("4",4); 
  20.         items[4] = new MenuItem("5",5); 
  21.     } 
  22.  
  23.     public Iterator createIterator(){ 
  24.         return new BreakFastIterator(items); 
  25.     } 

其中,菜单项menuItem如下:

  1. package com.zlh.iterator; 
  2.  
  3. public class MenuItem { 
  4.     private String name; 
  5.  
  6.     private double price; 
  7.  
  8.     public String getName() { 
  9.         return name; 
  10.     } 
  11.  
  12.     public void setName(String name) { 
  13.         this.name = name; 
  14.     } 
  15.  
  16.     public double getPrice() { 
  17.         return price; 
  18.     } 
  19.  
  20.     public void setPrice(double price) { 
  21.         this.price = price; 
  22.     } 
  23.  
  24.     public MenuItem(String name, double price) { 
  25.         this.name = name; 
  26.         this.price = price; 
  27.     } 

BreakfastMenu 有一个函数,主要是生成菜单项的迭代器,createIterator()。

根据“围绕接口编程原则”,编写了早餐菜单迭代器

 

  1. package com.zlh.iterator; 
  2.  
  3. public interface Iterator { 
  4.       boolean hasNext(); 
  5.       Object next(); 
  6.       void remove(); 
  7.  
  8.  
  9. package com.zlh.iterator; 
  10.  
  11. public class BreakFastIterator implements Iterator { 
  12.     private MenuItem[] items; 
  13.  
  14.     private int position; 
  15.  
  16.     public BreakFastIterator(MenuItem[] items) { 
  17.         this.items = items; 
  18.         this.position = 0
  19.     } 
  20.  
  21.     public boolean hasNext() { 
  22.         if (position < items.length && items[position]!=null
  23.             return true
  24.         else 
  25.             return false
  26.     } 
  27.  
  28.     public Object next() { 
  29.         MenuItem menuitem = items[position]; 
  30.         position++; 
  31.         return menuitem; 
  32.     } 
  33.  
  34.     public void remove() { 
  35.         throw new UnsupportedOperationException(); 
  36.     } 
  37.  

这样,以数组为菜单项存储形式的早餐菜单,就可以实现类似集合形式的迭代器访问了。由于数组不可删除,故remove()方法抛出UnsupportedOperationException异常。

下面是相应的测试类,服务员可以根据早餐,也可以根据以ArrayList形存储的中餐来传菜了。

 

  1. package com.zlh.iterator; 
  2.  
  3. public class Waitress { 
  4.     private BreakfastMenu breakfastMenu; 
  5.  
  6.     public BreakfastMenu getBreakfastMenu() { 
  7.         return breakfastMenu; 
  8.     } 
  9.  
  10.     public void setBreakfastMenu(BreakfastMenu breakfastMenu) { 
  11.         this.breakfastMenu = breakfastMenu; 
  12.     } 
  13.  
  14.     public Waitress(BreakfastMenu breakfastMenu) { 
  15.         this.breakfastMenu = breakfastMenu; 
  16.     } 
  17.  
  18.     public void printMenu(Iterator iterator){ 
  19.         while(iterator.hasNext()){ 
  20.             MenuItem menuItem = (MenuItem) iterator.next(); 
  21.             System.out.println("menu name:  "+menuItem.getName()); 
  22.             System.out.println("menu price:" + menuItem.getPrice()); 
  23.         } 
  24.     } 
  25.  
  26.  
  27. package com.zlh.iterator; 
  28.  
  29. public class TestDriver { 
  30.     public static void main(String[] args) { 
  31.         BreakfastMenu breakfastMenu = new BreakfastMenu(); 
  32.         Waitress waitress = new Waitress(breakfastMenu); 
  33.         Iterator iterator = breakfastMenu.createIterator(); 
  34.         waitress.printMenu(iterator); 
  35.          
  36.     }