迭代器模式
一、定义
提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节
迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发
迭代器的通用类图
Iterator是抽象迭代器,负责定义访问和遍历元素的接口; ConcreteIterator是具体迭代器,要实现迭代器接口,完成容器元素的遍历;Aggregate是抽象容器,负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法;Concrete Aggregate是具体容器,具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。
迭代器的通用源码
-
抽象迭代器
public interface Iterator { //遍历到下一个元素 public Object next(); //是否已经遍历到尾部 public boolean hasNext(); //删除当前指向的元素 public boolean remove(); }
-
具体迭代器
public class ConcreteIterator implements Iterator { private Vector vector = new Vector(); //定义当前游标 public int cursor = 0; @SuppressWarnings("unchecked") public ConcreteIterator(Vector _vector){ this.vector = _vector; } //判断是否到达尾部 public boolean hasNext() { if(this.cursor == this.vector.size()){ return false; }else{ return true; } } //返回下一个元素 public Object next() { Object result = null; if(this.hasNext()){ result = this.vector.get(this.cursor++); }else{ result = null; } return result; } //删除当前元素 public boolean remove() { //代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素 this.vector.remove(this.cursor); return true; } }
-
抽象容器
public interface Aggregate { //是容器必然有元素的增加 public void add(Object object); //减少元素 public void remove(Object object); //由迭代器来遍历所有的元素 public Iterator iterator(); }
-
具体容器
public class ConcreteAggregate implements Aggregate { //容纳对象的容器 private Vector vector = new Vector(); //增加一个元素 public void add(Object object) { this.vector.add(object); } //返回迭代器对象 public Iterator iterator() { return new ConcreteIterator(this.vector); } //删除一个元素 public void remove(Object object) { this.remove(object); } }
-
场景类
public class Client { public static void main(String[] args) { //声明出容器 Aggregate agg = new ConcreteAggregate(); //产生对象数据放进去 agg.add("abc"); agg.add("aaa"); agg.add("1234"); //遍历一下 Iterator iterator = agg.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }
注意:现在基本上很少有项目再独立写迭代器了,它已经成为一个最基础的工具,已经融入到各个语言和工具中了,基本上不用自己动手写迭代器了。