设计模式:迭代器模式

谁借莪1个温暖的怀抱¢ 2024-03-24 15:57 205阅读 0赞

一、定义:

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

迭代器模式又称为游标模式,源于对容器的访问,比如java中的List、Map、数组等,提供一个合理的遍历访问。用法就是在用户访问类,和容器之间插入一个迭代器,提供遍历访问。这样做可以让容器功能保持单一,不用在容器内实现遍历功能。也不用对外提供内部访问方法导致细节暴露。

二、角色

  • Aggregate:容器接口,负责提供创建具体迭代器角色;
  • ConcreteAggregate:具体容器类;
  • Iterator:迭代器接口,负责定义、访问和遍历元素的接口;
  • ConcreteIterator:具体迭代器类,实现迭代器接口,并记录遍历的当前位置;

三、模板代码

  • 迭代器接口

    public interface Iterator {

    1. /**
    2. * 是否还有下一个元素
    3. */
    4. boolean hasNext();
    5. /**
    6. * 返回当前位置的元素并将位置移至下一位
    7. */
    8. Object next();

    }

  • 具体迭代器类

    class ConcreteIterator implements Iterator {

    1. private List<T> list;
    2. public ConcreteIterator(List<T> list) {
    3. this.list = list;
    4. }
    5. /**
    6. * 当前位置
    7. */
    8. private int cursor = 0;
    9. @Override
    10. public boolean hasNext() {
    11. return cursor != list.size();
    12. }
    13. @Override
    14. public Object next() {
    15. T obj = null;
    16. if (hasNext()) {
    17. obj = list.get(cursor++);
    18. }
    19. return obj;
    20. }

    }

  • 容器接口

    interface Aggregate {

    1. void add(T obj);
    2. void remove(T obj);
    3. Iterator<T> iterator();

    }

  • 具体的容器类

    class ConcreteAggregate implements Aggregate {

    1. private List<T> list = new ArrayList<>();
    2. @Override
    3. public void add(T obj) {
    4. list.add(obj);
    5. }
    6. @Override
    7. public void remove(T obj) {
    8. list.remove(obj);
    9. }
    10. @Override
    11. public Iterator<T> iterator() {
    12. return new ConcreteIterator<T>(list);
    13. }

    }

  • Client

    public class Client {

    1. public static void main(String[] args) {
    2. ConcreteAggregate<String> concreteAggregate = new ConcreteAggregate<>();
    3. concreteAggregate.add("1");
    4. concreteAggregate.add("2");
    5. concreteAggregate.add("3");
    6. concreteAggregate.add("4");
    7. Iterator<String> iterator = concreteAggregate.iterator();
    8. while (iterator.hasNext()){
    9. System.out.println(iterator.next());
    10. }
    11. }

    }

四、Android源码中的迭代器模式

  • 各种list、map集合
  • 数据库数据查询Cursor

五、优缺点

  • 优点:支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系;
  • 缺点:类文件的增加;

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-模式

    > 迭代器模式结构图 意图:提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。  ![watermar

    相关 设计模式- 模式

    设计模式 - 迭代器模式 场景 小张的朋友开了一家酒店,最近新收购了一家庭旅馆。需要对自己酒店的房间和家庭旅馆的房间进行统一管理,但是两家之间都有各自的实现存储房间

    相关 设计模式——模式

    迭代器模式定义 提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 使用场景 循环打印一个字符串集合,里面就用到了迭代器模式,迭代器的作用就是将