設計模式:7.迭代器模式

迭代器模式

迭代器模式屬於行爲型模式,描述的是類之間的關係

定義: 它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節

迭代器模式就是爲解決遍歷元素而誕生的,java而言,使用java提供的iterator就可以了,不用需要手動去寫迭代器

模式類圖

在這裏插入圖片描述
角色

  1. 抽象迭代器:Iterator,負責定義訪問和遍歷元素的接口
  2. 具體迭代器:ConcreteIterator,實現Iterator接口
  3. 抽象容器:Aggregate,負責提供創建具體迭代器角色的接口
  4. 具體容器: ConcreteAggregate,實現Aggregate接口

抽象迭代器

Iterator提供兩個方法,返回下一個元素,是否還有下一個元素

public interface Iterator {

    /**
     * 返回下一個元素
     * @return
     */
    public Object next();

    /**
     * 是否還有下一個元素
     * @return
     */
    public boolean hasNext();

}

具體迭代器實現
cursor爲容器遍歷元素時當前元素的容器下標

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

抽象容器

提供三個方法,增加容器元素,刪除容器元素,獲取當前容器的迭代器

public interface Aggregate {

    /**
     * 增加元素
     * @param s
     */
    public void add(String s);

    /**
     * 刪除元素
     * @param s
     */
    public void remove(String s);

    /**
     * 獲取當前容器的迭代器
     * @return
     */
    public Iterator createIterator();
}

具體容器實現

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

參考:設計模式之禪:https://www.kancloud.cn/sstd521/design/193578

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章