迭代器模式

模式名稱:迭代器模式 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內部存儲結構改變 我們只需要修改迭代器實現類的實現,而無需修改客戶端代碼,如果只有一兩處修改,修改客戶端沒什么,當使用量特別大的時候,就比較棘手了,只需要修改迭代器實現,一勞永逸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容