1. 程式人生 > >Android設計模式之迭代器模式

Android設計模式之迭代器模式

迭代器模式又稱遊標模式, 是行為型設計模式之一。迭代器模式源於對容器的訪問,比如Java中的List、Map、陣列等。

對容器物件的訪問必然會涉及到遍歷演算法,可以將遍歷演算法封裝在容器中,或者不提供遍歷演算法。如果將遍歷演算法封裝在容器中,那麼容器類就承擔了過多的功能,容器類不僅要維護自身內部的資料元素,而且還要對外提供遍歷的介面方法,因為遍歷狀態的儲存問題還不能對同一個容器同時進行多個遍歷操作,如果我們不提供遍歷方法而讓使用者自己去實現,又會讓容器的內部細節暴露無遺,正因為此,迭代器模式應運而生,在客戶訪問類和容器體之間插入一箇中間者——迭代器。

迭代器模式的定義

提供一種方法順序訪問一個容器物件中的各個元素,而又不需要暴露該物件的內部表示。

迭代器模式的使用場景

遍歷一個容器物件使。

迭代器模式的UML圖

 

 

角色介紹

Iterator:迭代器介面

迭代器介面負責定義、訪問和遍歷元素的介面。

Concrete Iterator:具體迭代器類

具體迭代器類的目的主要是實現迭代器介面,並記錄遍歷的當前位置。

Aggreate:容器介面

容器介面負責提供建立具體迭代器角色的介面

Concrete Aggregate:具體容器類

具體迭代器角色與該容器相互關聯

Client:客戶類

 

迭代器模式簡單Demo

package iterator.gome.com.iteratordemo;
public interface Iterator<T> {

    /**
     *
     * @return true 表示有,false表示沒有
     */
    boolean hasNext();

    /**
     *
     * @return  返回當前位置的元素並將位置移至下一位
     */
    T next();
}

 

package iterator.gome.com.iteratordemo;

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

public class ConcreteIterator<T> implements Iterator<T> {

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

    public ConcreteIterator(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }

        return obj;
    }
}

 

package iterator.gome.com.iteratordemo;

public interface Aggregate<T> {

    /**
     * 新增一個元素
     * @param obj
     */
    void add(T obj);

    /**
     * 移除一個元素
     * @param obj
     */
    void remove(T obj);

    /**
     * 獲取容器迭代器
     * @return  返回迭代器物件
     */
    Iterator<T> iterator();
}

 

package iterator.gome.com.iteratordemo;

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

public class ConcreteAggregate<T> implements Aggregate<T> {

    private List<T> list = new ArrayList<T>();

    @Override
    public void add(T obj) {
        list.add(obj);
    }

    @Override
    public void remove(T obj) {
        list.remove(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<T>(list);
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Aggregate<String> a = new ConcreteAggregate<String>();

        a.add("Aige");
        a.add("Studio \n");
        a.add("OK");
        a.add(" Brother");

        Iterator<String> i = a.iterator();
        while(i.hasNext()) {
            Log.v("zy_itagrator", i.next() + "");
        }
    }
}

 

Log分析:

V/zy_itagrator: Aige

V/zy_itagrator: Studio

V/zy_itagrator: OK

V/zy_itagrator: Brother

 

迭代器模式對於開發者來說幾乎不會自己去實現一個迭代器,就拿Android來說,其除了各種資料結構體,如List、Map等所包的迭代器外,Android自身原始碼中也為我們提供了迭代器遍歷資料,最為典型的就是資料庫查詢使用的Cursor,當我們使用SQLiteDatabase的query方法查詢資料庫時,會返回一個Cursor遊標物件,該遊標物件實質上是一個具體的迭代器,我們可以使用它來遍歷資料庫查詢所得到的結果集。

 

 

參考《Android原始碼設計模式》