OkHttp设计模式剖析(七)迭代器模式

上一篇 OkHttp设计模式剖析(六)外观模式

下一篇 OkHttp设计模式剖析(八)工厂模式

OKHTTP:

由大名鼎鼎的Square公司开发的网络通信库。

设计模式:

软件开发中问题的解决套路。

迭代器模式简介

定义:提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式(Iterator Pattern)又称作游标(Cursor)模式,用于遍历一个容器对象,将遍历逻辑封装。大部分高级语言的容器类都为我们提供了响应的迭代器,基本不需要开发者实现,比如java的HashMap:

Map map=new HashMap();                
map.put("6", "伊涅斯塔");    
map.put("16", "布斯克茨");    
map.put("15", "拉莫斯");    
map.put("1", "卡西利亚斯");    
// import java.util.Iterator;           
Iterator iterator = map.keySet().iterator();     
while (iterator.hasNext()) {    
    Object key = iterator.next();    
    System.out.println("map.get(key) is :"+map.get(key));    
} 

所以,对于迭代器模式,了解即可,自己写的几率不大。

Cache 类中的迭代器模式

不仅是OkHttp中的缓存(Cache),基本所有的缓存类都会像一个小数据库一样支持“增删改查”。既然有“查”的功能,那迭代器必不可少。

import java.util.Iterator;
// 将HTTP和HTTPS响应缓存到文件系统,以便可以重用它们,从而节省时间和带宽。
public final class Cache implements Closeable, Flushable {

  private final DiskLruCache cache;

  // 返回此缓存中URL的迭代器。
  public Iterator urls() throws IOException {
    return new Iterator() {
      final Iterator delegate = cache.snapshots();

      String nextUrl;
      boolean canRemove;

      @Override public boolean hasNext() {
        if (nextUrl != null) return true;

        canRemove = false; // 防止误删除
        while (delegate.hasNext()) {
          DiskLruCache.Snapshot snapshot = delegate.next();
          try {
            BufferedSource metadata = Okio.buffer(snapshot.getSource(ENTRY_METADATA));
            nextUrl = metadata.readUtf8LineStrict();
            return true;
          } catch (IOException ignored) {
          // 主机消失,跳过
          } finally {
            snapshot.close();
          }
        }

        return false;
      }
      @Override public String next() {......} //返回下一个URL
      @Override public void remove() {......} // 删除
    };
  }
}

基于迭代器模式构建的其他代码

1、Android中SQLiteDatabase的query方法
2、ListView控件在Adapter中配置迭代器

食堂排队打饭都是迭代器

public static void main(String[] args){
    List list=new ArrayList();                
    list.add("老板,来份老麻抄手");    
    list.add("老板,来份宜宾燃面");    
    list.add("老板,来份重庆小面");       
       
    for(Iterator it=list.iterator();it.hasNext();){
        System.out.println(it.next());
    }
}
/* 输出
老板,来份老麻抄手
老板,来份宜宾燃面
老板,来份重庆小面
*/

参考文献

1、设计模式|菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2、《Android源码设计模式解析与实战》何红辉,关爱民著
3、隔壁老李头:https://www.jianshu.com/p/82f74db14a18

上一篇 OkHttp设计模式剖析(六)外观模式

下一篇 OkHttp设计模式剖析(八)工厂模式

All is well.

你可能感兴趣的:(OkHttp设计模式剖析(七)迭代器模式)