设计模式学习(十六)迭代器模式

介绍

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示

类图说明

在这里插入图片描述
类图描述如下:
定义一个迭代器Iterator接口,定义hasNext()和next()方法,然后定义一个具体迭代器实现类来实现定义的两个方法。再定义一个Container容器和容器具体实现类ConcreteContainer,该容器直接关联迭代器,并能返回迭代器实例对象,在该容器定义允许对迭代对象List进行add跟remove。迭代器所有类定义完成,再起一个IteratorPattern来调用看结果。

代码示例

文件结构如下:
在这里插入图片描述

代码示例如下:

public interface Iterator {
    
    
    boolean hasNext();
    Object next();
}
public class ConcreteIterator implements Iterator {
    
    

    private List<Object> list = new ArrayList<>();

    private int cursor = 0;

    public ConcreteIterator(List<Object> list) {
    
    
        this.list = list;
    }

    @Override
    public boolean hasNext() {
    
    
        if(this.cursor == list.size()){
    
    
            return false;
        }
        return true;
    }

    @Override
    public Object next() {
    
    
        Object object = null;
        if(hasNext()){
    
    
            object = list.get(cursor);
            cursor++;
        }
        return object;
    }
}
public interface Container {
    
    

    Iterator iterator();
    void add(Object o);
    void remove(Object o);
}
public class ConcreteContainer implements Container {
    
    

    private List<Object> list = new ArrayList<>();

    @Override
    public Iterator iterator() {
    
    
        return new ConcreteIterator(this.list);
    }

    @Override
    public void add(Object o) {
    
    
        this.list.add(o);
    }

    @Override
    public void remove(Object o) {
    
    
        this.list.remove(o);
    }
}
public class IteratorPattern {
    
    
    public static void main(String[] args) {
    
    
        ConcreteContainer concreteContainer = new ConcreteContainer();
        concreteContainer.add("zhangsan");
        concreteContainer.add("lisi");
        concreteContainer.add("wangwu");

        Iterator iterator = concreteContainer.iterator();
        while (iterator.hasNext()){
    
    
            System.out.println(iterator.next());
        }

    }
}

运行结果如下:
在这里插入图片描述

应用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示
  • 需要为聚合对象提供多种遍历方式
  • 为遍历不同的聚合结构提供一个统一的接口

优缺点

优点

  • 它支持以不同的方式遍历一个聚合对象
  • 迭代器简化了聚合类
  • 在同一个聚合上可以有多个遍历
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码

缺点

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

Guess you like

Origin blog.csdn.net/he_cha_bu/article/details/116106545