设计模式-23-迭代器模式
个人github地址:HibisciDai
设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai
processon在线UML类图:processon
[TOC]
设计模式-23-迭代器模式
迭代器模式(Iterator Pattern)
意图
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决
不同的方式来遍历整个整合对象。
何时使用
遍历一个聚合对象。
关键代码
定义接口:hasNext, next。
如何解决
把在元素之间游走的责任交给迭代器,而不是聚合对象。
应用实例
JAVA 中的 iterator。
优点
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 需要为聚合对象提供多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
注意事项
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
案例1
模拟数组迭代
类图
代码
pattern23.iterator.demo1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public interface Container { public Iterator getIterator(); }
public interface Iterator { public boolean hasNext();
public Object next(); }
public class NameRepository implements Container { public String names[] = { "Robert", "John", "Jalie", "Lora" };
@Override public Iterator getIterator() { return new NameIterator(); }
private class NameIterator implements Iterator { int index;
@Override public boolean hasNext() { if (index < names.length) { return true; } return false; }
@Override public Object next() { if (this.hasNext()) { return names[index++]; } return null; }
} }
|
测试输出
1 2 3 4 5 6 7 8 9
| public class Main { public static void main(String[] args) { NameRepository nr = new NameRepository(); for (Iterator it = nr.getIterator(); it.hasNext();) { String name = (String) it.next(); System.out.println("name : " + name); } } }
|
1 2 3 4
| name : Robert name : John name : Jalie name : Lora
|