标签:false 对象 div span 封装 item 学习笔记 null strong
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示
特点:
注意:
外部迭代器vs内部迭代器:
单一责任原则:一个类应该只有一个变化的原因
举例:
餐厅对于早餐和午餐菜单的菜单项的底层存储方式不同,如果不进行任何优化,服务员遍历菜单时需要根据具体菜单的存储方式使用不同的遍历办法,也对于修改开放的方式不便于维护,不利于扩展
我们将变化的部分拿出来,创建具有单一责任的迭代器对象实现遍历菜单,并封装菜单的存储方式,使服务员无需知道,与服务员解耦
迭代器接口:
1 public interface Iterator { 2 boolean hasNext(); 3 Object next(); 4 }
晚餐菜单迭代器实现,针对其底层数组存储方式:
1 public class DinerMenuIterator implements Iterator { 2 MenuItem[] items; 3 int position = 0; 4 5 public DinerMenuIterator(MenuItem[] items) { 6 this.items = items; 7 } 8 9 public Object next() { 10 MenuItem menuItem = items[position]; 11 position = position + 1; 12 return menuItem; 13 } 14 15 public boolean hasNext() { 16 if (position >= items.length || items[position] == null) { 17 return false; 18 } else { 19 return true; 20 } 21 } 22 }
服务生通过迭代器遍历菜单:
1 public class Waitress { 2 Menu dinerMenu; 3 public Waitress( Menu dinerMenu) { 4 this.dinerMenu = dinerMenu; 5 } 6 public void printMenu() { 7 Iterator dinerIterator = dinerMenu.createIterator(); 8 9 System.out.println("/nLUNCH"); 10 printMenu(dinerIterator); 11 } 12 private void printMenu(Iterator iterator) { 13 while (iterator.hasNext()) { 14 MenuItem menuItem = (MenuItem)iterator.next(); 15 System.out.print(menuItem.getName() + ", "); 16 System.out.print(menuItem.getPrice() + " -- "); 17 System.out.println(menuItem.getDescription()); 18 } 19 }
标签:false 对象 div span 封装 item 学习笔记 null strong
原文地址:http://www.cnblogs.com/HectorHou/p/6006093.html