迭代器(iterator)模式

来源:互联网 发布:豪沃克幕墙计算软件 编辑:程序博客网 时间:2024/06/18 01:23

模式名称:迭代器模式 Iterator

描述:一个一个遍历

对代码的作用:当数据容器内存储结构发生改变,不必修改客户端遍历的代码

容器接口:

public interface Container<T> {    ContainerIterator<T> iterator();    void add(T element);}
迭代器接口:

public interface ContainerIterator<T> {    T next();    boolean hasNext();    void setSize(int size);    T prev();}

容器实现:

public class ContainerImpl<T> implements Container<T> {    private Object[] elements;    private int index;    private int size;    private ContainerIterator iterator;    public ContainerImpl() {        elements = new Object[10];        iterator = new ContainerIteratorImpl(elements, size);    }    @Override    public ContainerIterator iterator() {        return iterator;    }    @Override    public void add(T element) {        if(index > 9) {            throw new ArrayIndexOutOfBoundsException();        }        elements[index++] = element;        ++size;        iterator.setSize(size);    }}
迭代器实现:
public class ContainerIteratorImpl<T> implements ContainerIterator<T> {    private int index = 0;    private Object[] elements;    private int size;    public ContainerIteratorImpl(Object[] elements, int size) {        this.elements = elements;        this.size = size;    }    @Override    public T next() {        return (T)elements[index++];    }    @Override    public boolean hasNext() {        return index < size;    }    @Override    public void setSize(int size) {        this.size = size;    }    @Override    public T prev() {        if(index < 1) {            throw new ArrayIndexOutOfBoundsException();        }        return (T) elements[--index];    }}

容器元素:

public class User {    private String name;    private int age;    public User(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "User{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}
客户端:
public class Main {    public static void main(String[] args) {        Container<User> userList = new ContainerImpl<>();        userList.add(new User("小明", 20));        userList.add(new User("小红", 23));        userList.add(new User("小刚", 12));        userList.add(new User("小离", 24));        ContainerIterator<User> iterator = userList.iterator();        while (iterator.hasNext()) {            System.out.println(iterator.next());        }    }}


UML图:




总结:当ContainerImpl内部存储结构改变 我们只需要修改迭代器实现类的实现,而无需修改客户端代码,如果只有一两处修改,修改客户端没什么,当使用量特别大的时候,就比较棘手了,只需要修改迭代器实现,一劳永逸





原创粉丝点击