设计模式---迭代器模式

来源:互联网 发布:淘宝网老年80岁女冬装 编辑:程序博客网 时间:2024/06/05 14:53

定义

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

理解

遍历一个数组不难,遍历一个ArrayList也不难,但是如果两个一起出现,需要你同时兼容这两个怎么办呢?
这就需要用到迭代器模式。

迭代器与集合是相关的,集合又称聚合、容器等,每个集合都可以看作一种包容对象的容器,例如数组、ArrayList、Map等等。而迭代器的作用就是遍历这些容器。

迭代器模式中有四个角色:抽象迭代器、具体迭代器、抽象容器、具体容器。

  • 抽象迭代器:提供了遍历元素所需要的方法,例如hasNext()、next()、remove()等等。
  • 具体迭代器:实现抽象迭代器接口。
  • 抽象容器:提供一个方法,用以创建迭代器。
  • 具体容器:实现抽象容器接口,用来创建具体的迭代器。

迭代器中抽象容器提供一个抽象方法,具体容器实例化迭代器。这其实就是一个工厂模式。

每新加入一种聚合对象都需要提供一个与之匹配的迭代器。

代码

抽象迭代器

public interface Iterator {    boolean hasNext();    Object next();    void remove();}

具体迭代器

public class ConcreteIterator_Array implements Iterator {    private Object[] array;    private int position;    public ConcreteIterator_Array(Object[] array) {        this.array = array;    }    @Override    public boolean hasNext() {        if (position >= array.length || array[position] == null) {            return false;        } else {            return true;        }    }    @Override    public Object next() {        Object object = array[position];        position++;        return object;    }    @Override    public void remove() {        if (position < 0) {            throw new UnsupportedOperationException("illegal");        }        if (array[position - 1] != null) {            for (int i = position - 1; i < array.length - 1; i++) {                array[i] = array[i + 1];            }        }        array[array.length - 1] = null;    }}public class ConcreteIterator_ArrayList implements Iterator{    private List<Object> list = new ArrayList<>();    private int position;    public ConcreteIterator_ArrayList(List<Object> list) {        this.list = list;    }    @Override    public boolean hasNext() {        if(position>=list.size() || list.get(position) == null){            return false;        }else {            return true;        }    }    @Override    public Object next() {        Object object = list.get(position);        position++;        return object;    }    @Override    public void remove() {        if(position<0){            throw new UnsupportedOperationException("illegal");        }        if(list.get(position - 1)!=null){            for(int i = position-1;i<list.size()-1;i++){                list.set(i,list.get(i+1));            }        }        list.remove(list.size()-1);    }}

抽象容器:

public interface Aggregate {    Iterator createIterator();}

具体容器:

public class ConcreteAggregate_Array implements Aggregate {    private Object[] array;    public ConcreteAggregate_Array(Object[] array) {        this.array = array;    }    @Override    public Iterator createIterator() {        return new ConcreteIterator_Array(array);    }}public class ConcreteAggregate_ArrayList implements Aggregate {    private List<Object> list = new ArrayList<>();    public ConcreteAggregate_ArrayList(List<Object> list) {        this.list = list;    }    @Override    public Iterator createIterator() {        return new ConcreteIterator_ArrayList(list);    }}

总结

迭代器模式将数据本身和数据的操作分开了,在不关心数据结构的情况下就能做到直接进行操作。

每增加一种集合,就需要创建相应的迭代器。

迭代器模式是在有较多种集合的情况下才会去考虑的,虽然降低了耦合,但是用起来并不一定比直接遍历轻松。

原创粉丝点击