设计模式(十四)—迭代器模式

最后更新于:2022-04-01 16:26:23

 **定义**:它提供一个方法访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。 这个在javaAPI中已经封装的很好了,任何一个容器的遍历都可以使用Iterator来迭代。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340b68b90.jpg) ## 一般模式: Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,基本上有三个方法。next()、hasNext()、remove(); ConcreteIterator具体迭代器 具体迭代器角色要实现迭代器的接口,完成容器元素的遍历。 Aggregate抽象容器 容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似iterator()方法 Concrete Aggregate具体容器。 具体容器实现容器接口定义的方法,创建出容纳迭代器的对象 ~~~ public class IteratorTest { public static void main(String[] args) { //模拟容器,添加一些信息 Aggreragte aggVector = new ConcreteAggregate(); aggVector.add("lzl"); aggVector.add("xy"); aggVector.add("daughter"); //遍历 Iterator it = aggVector.iterator(); while(it.hasNext()){ //如果有下一个。获取信息 String info = (String) it.next(); System.out.println("------"+info); } } } /** * 抽象的迭代器,只提供基本的方法。 * * @author admin * */ interface Iterator{ //删除 boolean remove(); //是否还有下一个 boolean hasNext(); //找到下一个元素。 Object next(); } /** * 具体接口的实现方法 * @author admin * */ class ConcreteIterator implements Iterator{ private Vector vector ; private int cursor = 0; //构造函数,将需要遍历的vector对象传递进来 public ConcreteIterator(Vector vector) { this.vector = vector; } @Override public boolean remove() { boolean flag = (boolean) this.vector.remove(this.cursor); return flag; } @Override public boolean hasNext() { if(vector.size() != cursor){ return true; } return false; } @Override public Object next() { //如果还有下一个,就返回 if(this.hasNext()){ return this.vector.get(cursor++); } return null; } } /** * 抽想的接口容器类,例如java中的List集合等. * @author admin * */ interface Aggreragte{ //增加元素 boolean add(Object obj); //创建迭代器的接口。 Iterator iterator(); //删除元素 boolean remove(Object obj); } /** * 具体的抽象容器接口实现类,例如java中的ArrayList集合。 * @author admin * */ class ConcreteAggregate implements Aggreragte{ private Vector vector = new Vector(); @Override public Iterator iterator() { return new ConcreteIterator(this.vector); } @Override public boolean add(Object obj) { boolean flag = vector.add(obj); return flag; } @Override public boolean remove(Object obj) { boolean flag = vector.remove(obj); return flag; } } ~~~
';