欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一天一个设计模式 - Iterator

程序员文章站 2024-02-23 15:10:28
...

Iterator 模式

Iterator 模式粗暴地理解就是一个个遍历。先看栗子:

int length = arr.length;
for(int i = 0; i < length; i++) {
  System.out.println(arr[i)
}

程序中我们经常用到这样的循环,实现从头到尾的遍历工作。

如果我们将这其中的 i 进行抽象化,在设计模式中就叫做 Iterator 模式,俗称迭代器

用这种设计模式,我们自己实现一个把商品放置到货架上,并把商品名称按照排列顺序打印出来的小栗子。

这里关于货架和商品类的定义就不再赘述,直接看主程序:

public class Main {
  public static void main(String[] args) {
    // 我们有一个长度为4的货架
    ProductShelf productShelf = new ProductShelf(4);
    
    // 上面摆满了老奶奶的各种稀奇古怪的商品
    productShelf.putProduct("橡皮擦");
    productShelf.putProduct("作业本");
    productShelf.putProduct("火锅底料");// wtf???
    productShelf.putProduct("耳机");
    
    // ProductShelf 引入了 Iterator
    Iterator it = productShelf.iterator();
    
    // 我们从老奶奶的货架上一个一个来看商品名称
    while(it.hasNext()) {
      Product product = (Product)it.next();
      System.out.println(product.getName());
    }
    
  }
}

Demo 代码可以参考 https://github.com/MrNullPoint/IteratorExample

解惑

为什么要用 Iterator ,不直接用 for 循环遍历呢?

引入 Iterator 之后可以将遍历和实现分开,看刚才的 while 循环,我们并没有调用 ProductShelf 中的任何方法,在循环过程中,我们不依赖 ProductShelf 的实现。也就是说不管编写 ProductShelf 的是谁,我们都能拿过来就能遍历,管它是怎么存储 Product,使用 List 还是 Vector 或者其他什么的,对于开发者来说非常方便。

迭代器只能从前往后遍历?

不是的,我们可以根据需要自己编写 Iterator ,让它从后往前,指定下标或者任何你需要的方式。