迭代器模式
定义
提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。
简单来说,不同种类的对象可能需要不同的遍历方式,我们对每一种类型的对象配一个迭代器,最后多个迭代器合成一个
主要解决
不同的方式来遍历整个整合对象
何时使用
遍历一个聚合对象
如何解决
把在元素之间游走的责任交给迭代器,而不是聚合对象
关键代码
定义接口:hasNext,next
应有实例
JAVA中的iterator
优点
1、它支持以不同的方式遍历一个聚合对象
2、迭代器简化了聚合类
3、在同一个聚合上可以有多个遍历
4、在迭代器模式中,增加新的聚合类和迭代器都很方便,无需修改源代码
缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
模式结构和代码示例
(1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext(),移出当前对象的方法remove()
(2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代
(3)容器角色(Aggregate):一般是一个接口,提供一个iterato()方法,例如java中的collection接口,List接口,Set接口等
(4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等
举例(咖啡厅和中餐厅合并,他们两个餐厅的菜单一个是数组保存的,一个是ArrayList保存的。遍历方式不一样,使用迭代器聚合访问,只需要一种方式)
1、迭代器接口
public interface Iterator {
public boolean hasNext();
public Object next();
}
2、咖啡店菜单和咖啡店菜单遍历器
public class CakeHouseMenu {
private ArrayList<MenuItem> menuItems;
public CakeHouseMenu() {
menuItems = new ArrayList<MenuItem>();
addItem("KFC Cake Breakfast","boiled eggs&toast&cabbage",true,3.99f);
addItem("MDL Cake Breakfast","fried eggs&toast",false,3.59f);
addItem("Stawberry Cake","fresh stawberry",true,3.29f);
addItem("Regular Cake Breakfast","toast&sausage"