详解设计模式 迭代器模式

354 阅读4分钟

迭代器模式

迭代器模式属于行为型模式,描述的是类之间的关系

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

迭代器模式就是为解决遍历元素而诞生的,java而言,使用java提供的iterator就可以了,不用需要手动去写迭代器

模式类图

角色:

  1. 抽象迭代器:Iterator,负责定义访问和遍历元素的接口
  2. 具体迭代器:ConcreteIterator,实现Iterator接口
  3. 抽象容器:Aggregate,负责提供创建具体迭代器角色的接口
  4. 具体容器: ConcreteAggregate,实现Aggregate接口

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

抽象迭代器

Iterator提供两个方法,返回下一个元素,是否还有下一个元素

/**
 * @author: chenmingyu
 * @date: 2019/3/17 19:07
 * @description: 抽象迭代器
 */

public interface Iterator {

    /**
     * 返回下一个元素
     * @return
     */

    public Object next();

    /**
     * 是否还有下一个元素
     * @return
     */

    public boolean hasNext();

}
具体迭代器实现

cursor为容器遍历元素时当前元素的容器下标

/**
 * @author: chenmingyu
 * @date: 2019/3/18 09:50
 * @description: 具体迭代器实现
 */

public class ConcreteIterator implements Iterator {

    /**
     * 当前位置
     */

    public int cursor = 0;

    /**
     * 容器
     */

    private List<String> list;

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

    @Override
    public Object next() {
        if(this.hasNext()){
            return this.list.get(this.cursor++);
        }
        return null;
    }

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

提供三个方法,增加容器元素,删除容器元素,获取当前容器的迭代器

/**
 * @auther: chenmingyu
 * @date: 2019/3/18 09:51
 * @description: 抽象容器
 */

public interface Aggregate {

    /**
     * 增加元素
     * @param s
     */

    public void add(String s);

    /**
     * 删除元素
     * @param s
     */

    public void remove(String s);

    /**
     * 获取当前容器的迭代器
     * @return
     */

    public Iterator createIterator();
}
具体容器实现
/**
 * @author: chenmingyu
 * @date: 2019/3/18 11:16
 * @description: 具体容器实现
 */

public class ConcreteAggregate implements  Aggregate {

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

    @Override
    public void add(String s) {
        list.add(s);
    }

    @Override
    public void remove(String s) {
        list.remove(s);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }
}
验证
public static void main(String[] args) {
    Aggregate aggregate = new ConcreteAggregate();
    aggregate.add("first title");
    aggregate.add("second title");
    aggregate.add("third title");
    Iterator iterator = aggregate.createIterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

输出

first title
second title
third title