在上次的文章中,咱们经过层层引导,已经知道了迭代器模式的由来。如今咱们再好好总结下。java
关于迭代器模式,你所须要知道的第一件事情,就是它依赖于一个名为迭代器的接口。这是一个可能的迭代器的接口:数组
如今,咱们一旦有了这个接口,就能够为各类对象集合实现迭代器:数组、列表、散列表...若是我么想要为数组实现迭代器,以便使用在DinerMenu中,看起来就像这样:学习
想要在餐厅菜单中加入一个迭代器,咱们须要先定义迭代器接口:this
public interface Iterator { boolean hasNext(); Object next(); }
如今咱们须要实现一个具体的迭代器,为餐厅菜单服务:设计
public class DinerMenuIterator implements Iterator { MenuItem[] items; int position = 0; public DinerMenuIterator(MenuItem[] items) { this.items = items; } public MenuItem next() { MenuItem menuItem = items[position]; position = position + 1; return menuItem; } public boolean hasNext() { if (position >= items.length || items[position] == null) { return false; } else { return true; } } }
接下来,咱们改写下餐厅菜单:3d
public Iterator createIterator() { return new DinerMenuIterator(menuItems); // To test Alternating menu items, comment out above line, // and uncomment the line below. //return new AlternatingDinerMenuIterator(menuItems); }
咱们须要将迭代器代码整合进服务员中。咱们应该摆脱本来冗余的部分。整合的作法至关直接:首先建立一个printMenu()方法,传入一个迭代器当作此方法的参数,而后对每个菜单都是用createIterator()方法来检索迭代器,并将迭代器传入新方法。code
public class Waitress { Menu pancakeHouseMenu; Menu dinerMenu; public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) { this.pancakeHouseMenu = pancakeHouseMenu; this.dinerMenu = dinerMenu; } public void printMenu() { Iterator pancakeIterator = pancakeHouseMenu.createIterator(); Iterator dinerIterator = dinerMenu.createIterator(); System.out.println("MENU\n----\nBREAKFAST"); printMenu(pancakeIterator); System.out.println("\nLUNCH"); printMenu(dinerIterator); } private void printMenu(Iterator iterator) { while (iterator.hasNext()) { MenuItem menuItem = iterator.next(); System.out.print(menuItem.getName() + ", "); System.out.print(menuItem.getPrice() + " -- "); System.out.println(menuItem.getDescription()); } } // 此处省略其余方法 }
熟悉Java的同窗应该知道,其实Java有自带的迭代器接口。可是,我在这里为何不这么作呢,是为了让咱们更好地了解如何从头建立一个迭代器。如今目的达到了,因此就要改变作法,把以前自定义的迭代器改为Java的Iterator接口便可,在这里就不进行具体描述啦,详情请看源码便可。对象
如今咱们已经知道了如何用本身的迭代器来实现迭代器模式,也看到了Java是如何在某些面向聚合的类中(入ArrayList)支持迭代器的。如今咱们就来看看这个模式真的正式定义:blog
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内容的表示。接口
这个模式给你提供了一种方法,能够顺序访问一个汇集对象中的元素,而又不用知道内部是如何表示的。在设计中使用迭代器的影响是明显的:若是你有一个统一的方法访问聚合中的每个对象,你就能够编写多态的代码和这些聚合搭配,使用--如同前面的printMenu()方法同样,只要有了迭代器这个方法根本无论菜单项到底是有由数组仍是ArrayList来保存的。
另外一个对你设计形成重要影响的,是迭代器模式把元素之间游走的责任交给迭代器,而不是聚合对象。这不只让聚合的接口和实现变得更简洁,也可让聚合更专一在它所应该专一的事情上面,而没必要去理会遍历的事情。
让咱们检查类图,未来龙去脉拼凑出来
至此,迭代器模式咱们就差很少都了解啦。可是,接下来,咱们还会介绍组合模式,它为何要和迭代器模式放在同一个章节里面呢?咱们下回分晓。