迭代器模式精讲(java)
一.迭代器模式
迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一;
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
二.迭代器模式的角色构成
(1)、迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove();
(2)、具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代;
(3)、容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等;
(4)、具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
三 .迭代器模式应用场景及意义
(1)、当你需要对聚合对象有多种遍历时,可以考虑用迭代器模式;
(3)、如果我们将遍历的方法封装到容器中,那么对于容器类来说就承担了过多功能,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法;
(4)、如果我们不提供遍历方法而让使用者自己去实现,又会让容器的内部暴露无遗。
四 .迭代器模式结构图
五 .具体代码实现
(1)、定义迭代器角色(Iterator)
public interface Iterator {
boolean hasNext();
Object next();
}
(2)、定义具体迭代器角色(Concrete Iterator)
class ConcreteIterator implements Iterator {
private int current = 0;//指向容器中莫为元素下一个位置
private ConcreteContainer ConContainer;
public ConcreteIterator (ConcreteContainer ConContainer) {
this.ConContainer = ConContainer;
}
/**是否还有下一个元素
* @return true表示有,false表示没有
*比较当前位置和容器的容量
*/
public boolean hasNext() {
return current < ConContainer.size;//将算法表达式结果作为布尔值
}
//返回当前值,后移动当前位置
public Object next() {
return ConContainer.items[current++];
}
}
(3)、定义容器角色(Container)
public interface Container {
public Iterator iterator();//迭代器
public void add(Object obj);//增加元素
public int getSize();//获取大小
public Object get(int index);//取元素
}
(4)、定义具体容器角色(ConcreteContainer )
public class ConcreteContainer implements Container{
public Object[] items;
public int size;//数组的长度
public int index;//数组下标
public Iterator iterator() {
return new ConcreteIterator(this);
}
public ConcreteContainer() {
index = 0;
size = 0;
items = new Object[100];
}
public void add(Object obj) {
items[index++] = obj;
size++;
}
@Override
public int getSize() {
return size;
}
@Override
public Object get(int index) {
return items[index];
}
}
(4)、测试代码
public class TestInterator {
public static void main(String[] args) {
ConcreteContainer cc = new ConcreteContainer();
cc.add("3");
cc.add("5");
Iterator it = cc.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
六 .迭代器模式优缺点
迭代器模式的优点有:
- 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
- 可以让迭代和集合对象解耦。新增迭代方式时不用修改集合对象,只需新增迭代对象即可,符合开闭原则。
总的来说: 迭迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样即可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。