Java设计模式设计模式

《设计模式》迭代器模式

2019-08-12  本文已影响2人  敏捷Studio

定义

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

介绍

UML类图

迭代器模式UML类图

角色说明:

实现

继续以快递举例子,货架上有很多快递包,取快递时我们报出手机号,然后快递小哥就遍历货架上所有的快递信息,直到找出快递包为止:

1、创建迭代器接口

public interface Iterator {      
  // 是否存在下一条记录
  boolean hasNext();    

  // 返回当前记录并移到下一条记录
  Object next();
}

2、创建容器接口。定义容器的基本功能以及提供创建迭代器的接口:

public interface Aggregate {
  // 容器大小
  int size();

  // 获取获取中指定位置的号码
  String get(int location);

  // 添加号码到容器中
  void add(String tel);

  // 从容器中移除号码
  void remove(String tel);
 
  // 返回容器的迭代器   
  Iterator iterator();
}

3、创建具体迭代器类。实现迭代器接口:

// 快递迭代类
public class DeliveryIterator implements Iterator {
  // 容器对象
  private Aggregate aggregate;
  // 当前索引
  private int index;

  public DeliveryIterator(Aggregate aggregate) {
    // 初始化容器对象
    this.aggregate = aggregate;
  }

  @Override
  public boolean hasNext() {
    if (index < aggregate.size()) {
      return true;
    } else {
      return false;
    }
  }

  @Override
  public Object next() {
    return aggregate.get(index++);
  }
}

4、创建具体容器类。实现容器接口中的功能:

// 快递容器类
public class DeliveryAggregate implements Aggregate {
  // 内部使用list来存储数据
  private List<String> list = new ArrayList<>();

  // 容器大小
  public int size() {
    return list.size();
  }

  public String get(int location) {
    return list.get(location);
  }

  public void add(String tel) {
    list.add(tel);
  }

  public void remove(String tel) {
    list.remove(tel);
  }

  @Override
  public Iterator iterator() {
    return new DeliveryIterator(this);
  }
}

5、客户端测试:

public void test() {
  Aggregate aggregate = new DeliveryAggregate();
  aggregate.add("1111");
  aggregate.add("2222");
  aggregate.add("3333");
  aggregate.add("9527");

  Iterator iterator = aggregate.iterator();
  while (iterator.hasNext()) {
    String tel = (String) iterator.next();
    System.out.println("当前号码为:" + tel);
  }
  System.out.println("后面没有了");
}

输出结果:

当前号码为:1111
当前号码为:2222
当前号码为:3333
当前号码为:9527
后面没有了

应用场景

优缺点

优点

缺点

Android中的源码分析

除了Java中的MapList等有用到迭代器模式之外,Android中使用数据库查询时返回的Cursor游标对象,实际上就是使用了迭代器模式来实现,首先先让我们来看下怎么使用Cursor

1、使用Cursor

Cursor cursor = sqLiteDatabase.query("table", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
  do {
    // 获得第一列数据
    cursor.getInt(0);
    // 获得第二列数据
    cursor.getString(1);
  } while (cursor.moveToNext());
}

2、Cursor源码

// Cursor是一个接口,实际上就是迭代器接口
public interface Cursor extends Closeable {
  // 其他代码略
  boolean moveToFirst();
  int getInt(int columnIndex);
  String getString(int columnIndex);
  boolean moveToNext();
}

从上面代码可以看出Cursor游标实际上就是个迭代器。

3、其他
有兴趣的可以去看下Java中的MapList等的源码,那个更直观简单。

上一篇下一篇

猜你喜欢

热点阅读