迭代器模式 - Iterator Pattern

WHAT

定义

provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation

它提供一种方法访问一个容器对象中各个元素,而又不需爆率该对象的内部细节

迭代器是为容器(能容纳对象的所有类型都可以称为容器,如Collection集合类型,Set类型等)服务的。为了解决遍历这些容器中的元素而诞生。

类图

Iterator 抽象迭代器

抽象迭代器负责定义方位和遍历元素的接口

基本上有固定的三个方法:

  • first() - 获取第一个元素
  • next() - 访问下一个元素
  • isDone() - 是否已经访问到底部
public interface Iterator {
  // 遍历到下一个元素
  public Object next();
  
  // 是否已经遍历到尾部
  public boolean hasNext();
  
  // 删除当前指向的元素
  public boolean remove();
  
}

ConcreteIterator 具体迭代器

要实现迭代器接口,完成容器元素的遍历。

public class ConcreteIterator implements Iterator {
  private Vector vector = new Vector();
  // 定义当前游标
  public int cursor = 0;
  @SuppressWarnings("unchecked")
  public ConcreteInterator(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;
  }
}

Aggregate 抽象容器

容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似CreateInterator()

public interface Agregate {
  // 是容器必然有元素的增加
  public void add(Object object);
  // 减少元素
  public void remove(Object object);
  // 由迭代器来遍历所有的元素
  public Iterator iterator();
}

Concrete Aggregate 具体容器

具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。

public class ConcreteAggregate implements Aggregate{
  // 容纳对象的容器
  private Vector vector = new Vector();
  
  // 增加一个元素
  public void add(Object object){
    this.vector.add(object);
  }
  
  //返回迭代器对象
  public Iterator itertor(){
    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());
    }
  }
}

HOW

最佳实践

尽量不要自己写迭代器模式,Java提供的Iterator一般就能满足要求。


《设计模式之禅》 第20章 迭代模式