设计模式之迭代器与组合模式(二)
在上次的文章中,我们通过层层引导,已经知道了迭代器模式的由来。现在我们再好好总结下。
关于迭代器模式,你所需要知道的第一件事情,就是它依赖于一个名为迭代器的接口。这是一个可能的迭代器的接口:
现在,我们一旦有了这个接口,就可以为各种对象集合实现迭代器:数组、列表、散列表...如果我么想要为数组实现迭代器,以便使用在dinermenu中,看起来就像这样:
在餐厅菜单中加入一个迭代器
想要在餐厅菜单中加入一个迭代器,我们需要先定义迭代器接口:
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; } } }
接下来,我们改写下餐厅菜单:
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()方法来检索迭代器,并将迭代器传入新方法。
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)支持迭代器的。现在我们就来看看这个模式真的正式定义:
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内容的表示。
这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。在设计中使用迭代器的影响是明显的:如果你有一个统一的方法访问聚合中的每一个对象,你就可以编写多态的代码和这些聚合搭配,使用--如同前面的printmenu()方法一样,只要有了迭代器这个方法根本不管菜单项究竟是有由数组还是arraylist来保存的。
另一个对你设计造成重要影响的,是迭代器模式把元素之间游走的责任交给迭代器,而不是聚合对象。这不仅让聚合的接口和实现变得更简洁,也可以让聚合更专注在它所应该专注的事情上面,而不必去理会遍历的事情。
让我们检查类图,将来龙去脉拼凑出来
至此,迭代器模式我们就差不多都了解啦。但是,接下来,我们还会介绍组合模式,它为什么要和迭代器模式放在同一个章节里面呢?我们下回分晓。
上一篇: 浅谈游戏开发中常见的设计模式
下一篇: 前端知识点汇总—面试看这一篇就够了