有许多种方法可以把对象堆起来成为一个集合。你可以把对象放进数组、堆栈、列表或者散列表(hashMap)中,每一种都有各自优缺点,但总有一个时候,你希望遍历这些对象,当你遍历对象时,你可能不希望客户看到你的实现,这时候就用到了迭代器模式。
假设有两个餐厅,用不同的数据结构来存储他们的菜单,一个餐厅使用数组,另一个餐厅使用ArrayList.
现在女招待需要打印出菜单上的每一项,按照一般方法就是用不同方法循环打印出菜单来,这里要写两个不同方法,如果有第三家餐厅,用另外方式存储菜单,我们就要另写方法了。
例如这样:
看到上面代码,我们应该想想如何封装遍历。
我们新建一个迭代器接口
我们需要实现一个具体的迭代器,为餐厅菜单服务。
餐厅菜单就变成这样了
现在女招待的代码变成这样
你还可以给Iterator接口添加方法,比如remove()
还能进一步提前出Menu接口
具体别的代码就不列出来了。这样女招待就能利用接口(而不是具体类)引用每一个菜单对象。这样就通过“针对接口编程,而不是针对实现编程”,我们就可以减少女招待与具体类之间的依赖。
迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
组合模式
我们也可以使用组合模式来解决上面菜单问题。
组合模式定义:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户一一致的方式处理个别对象以及对象组合。