工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家起一学习一下集合遍历
引子
例如Waitress类要遍历打印两种菜单,一种是基于ArrayList,一种是基于数组;
则Waitress要需对他们分别用两个不同的逻辑来遍历。
义定
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
迭代器模式供提了一种法方次序拜访一个聚合象对中的各个素元,而又不暴露该象对的部内表现。
类图
Iterator:抽象迭代器
这是有所迭代器都必须实现的接口,利用该接口法方可以在集合素元之间游走。可用java.util.Iterator
ConcreteIterator:详细迭代器
详细迭代器责负理管前目遍历的置位、成完集合素元的遍历。
public class DinerMenuIterator implements Iterator { MenuItem[] list; int position = 0; //记载前当遍历置位 public DinerMenuIterator(MenuItem[] list){ this.list = list } public Object next(){ MenuItem menuItem = list[position]; position = position + 1; return menuItem; } public boolean hasNext(){ if (position >= list.length || list[position] == null){ return false; } else { return true; } } }
Aggregate:抽象聚合(集合)
是对详细集合类的抽象,便利户客端代码,将户客端代码从详细集合象对中解耦。——让户客端:针对接口程编,而不针对实现程编
ConcreteAggregate:详细聚合(集合)
实现createIterator(),返回一个ConcreteIterator象对;该迭代器象对够能遍历象对集合。
public class DinerMenu { MenuItem[] menuItems; //返回迭代器接口 public Iterator createIterator { return new DinerMenuIterator( menuItems ); } //这个法方不再要需,因为会暴露部内实现!! public MenuItem[] getMenuItem(){ return menuItems; } }
长处
- 让户客遍历你的象对,而又没法窥视你存储象对的方法
- Iterator封装“遍历集合内个每象对的程过”;——将遍历的任务放在迭代器上,而不是集合上;简化了集合的接口和实现,也让义务各得其所(单一职责准则 > 高内聚)
- 每种ConcreteAggregate集合的部内实现可能不同,但遍历法方都统起一来了,便利户客端代码。——户客端代码与集合实现类解耦。
缺陷
应用场景
尽量不要自己写迭代器模式。应用Java供提的Iterator一般就足够了。
注:上例中是数组,所以自己写了个Iterator;如果是ArrayList则直接应用.iterator()可即!
文章结束给大家分享下程序员的一些笑话语录:
那是习惯决定的,一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器。历史(软件UI)的进步(改善)不是以个人意志(习惯)为转移的!