1. 程式人生 > >行為型設計模式-迭代器模式

行為型設計模式-迭代器模式

迭代器模式:

提供一種方法順序訪問一個聚合物件中的各個元素,而不需要暴露該物件的內部實現,可以實現保護目標物件的目的。

應用:JDK自帶的集合框架

迭代器模式參與角色:

迭代器角色(Iterator):迭代器角色負責定義訪問和遍歷元素的介面。

具體迭代器角色(Concrete Iterator):具體迭代器角色要實現迭代器介面,並要記錄遍歷中的當前位置。

容器角色(Container):容器角色負責提供建立具體迭代器角色的介面。

具體容器角色(Concrete Container):具體容器角色實現建立具體迭代器角色的介面——這個具體迭代器角色於該容器的結構相關。

容器角色:Container

package com.zhiwei.iterator;

public interface Container {

    public void add(Object obj);

    public void remove(Object obj);

    public Iterator iterator();
}

具體容器角色:ConcreteContainer

package com.zhiwei.iterator;

import java.util.ArrayList;
import java.util.List;

public
class ConcreteContainer implements Container { private List<Object> list = new ArrayList<Object>(); /** * 提供容器的迭代器訪問介面 */ public Iterator iterator() { return new ConcreteIterator(list); } /** * 容器自身的新增元素操作 */ public void add(Object obj) { list.add(obj); } /** * 容器自身的減少元素操作 */
public void remove(Object obj) { list.remove(obj); } }

迭代器角色:Iterator

package com.zhiwei.iterator;

public interface Iterator {

    public Object next();

    public boolean hasNext();
}

具體迭代器角色:ConcreteIterator

package com.zhiwei.iterator;

import java.util.ArrayList;
import java.util.List;

public class ConcreteIterator implements Iterator {

    private List<Object> list = new ArrayList<Object>();
    private int cursor = 0;

    /**
     * 迭代器關聯具體的容器類
     * @param list
     */
    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

    /**
     * 判斷容器是否還有下一個元素
     */
    public boolean hasNext() {
        if (cursor == list.size()) {
            return false;
        }
        return true;
    }

    /**
     * 獲取容器的下一個元素
     */
    public Object next() {
        Object obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);  //儲存遊標位置
        }
        return obj;
    }

}

測試程式碼:

Container container = new ConcreteContainer();
container.add("小明");
container.add("小紅");
container.add("小剛");
Iterator it = container.iterator();  //獲取迭代器:容器物件和迭代器物件已經關聯

while (it.hasNext()) {
String str = (String) it.next();
System.out.println(str);
}

效果:
這裡寫圖片描述

通俗解釋:

我們通過投硬幣去買地鐵票,可以確定買地鐵票的機器肯定有一個儲存地鐵幣的盒子,當我們投入硬幣買票時候,買票機器能偶檢測到剩餘的地鐵幣的數量,然後返回給客戶自身。這裡可以將存放地鐵幣的盒子扮演具體容器角色,而買票機器可以看作是一個迭代器,他知道容器裡面的所有資訊,併為外界提供一個訪問的介面,實現對具體容器物件(地鐵幣盒子)的資訊隱蔽。