迭代器模式

模式名稱:迭代器模式 Iterator
描述:一個一個遍歷
對代碼的作用:當(dāng)數(shù)據(jù)容器內(nèi)存儲結(jié)構(gòu)發(fā)生改變,不必修改客戶端遍歷的代碼
容器接口:

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();
}

容器實現(xiàn):

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);
  }
}

迭代器實現(xiàn):

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圖:


總結(jié):當(dāng)ContainerImpl內(nèi)部存儲結(jié)構(gòu)改變 我們只需要修改迭代器實現(xiàn)類的實現(xiàn),而無需修改客戶端代碼,如果只有一兩處修改,修改客戶端沒什么,當(dāng)使用量特別大的時候,就比較棘手了,只需要修改迭代器實現(xiàn),一勞永逸

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容