適配器模式(對象適配器)

對象適配器的「組合」比類適配器的「繼承」 更加靈活。java

定義:

將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。android

適配器模式最經典的應用應該就是android中的ListView,GridView了。數組

舉個栗子:

假如你是android framework的開發工程師,要設計一個ListView組件來展現數據,數據源的類已經定義好了並且不能被改動(開閉原則,好比String[],ArrayList,Cursor(這些都是adaptee,被適配者)等,可是這三個數據源(ITarget)的訪問數據接口並非統一的,要想獲取數據源的長度,String數組是length屬性,ArrayList是size(),Cursor是getCount();因此我這麼這個時候須要抽象出來一個適配器。(ArrayAdapter,ListAdapter,CursorAdapter)this

首先定義ListView須要的接口.spa

public interface IAdapter<T> {

     int getCount() ;


     T getItem(int pos);

     long getItemId(int pos) ;
}

把ArrayList轉爲ListView須要的接口設計

 

public class ListAdapter<T>  implements IAdapter {

    private List<T> data;//ITarget

    ListAdapter(List<T> data){
        this.data = data;
    }

    public int getCount() {
        return data.size();
    }

    public T getItem(int pos) {
        return data.get(pos);
    }

    public long getItemId(int pos) {
        return pos;
    }
}

 

String[] 轉爲ListView須要的接口(不必定是String,能夠是任意對象的數組)code

public class ArrayAdapter<T> implements IAdapter {

    private T[] data;

    ArrayAdapter(T[] data){
        this.data = data;
    }

    public int getCount() {
        return 0;
    }

    public Object getItem(int pos) {
        return null;
    }

    public long getItemId(int pos) {
        return 0;
    }
}

使用者適配器的代碼對象

 

public class ListView {

    private IAdapter baseAdapter;

    public void setAdapter(IAdapter baseAdapter){
        this.baseAdapter = baseAdapter;
    }

    public void inflateView() {
        int count = baseAdapter.getCount();
        Object object = baseAdapter.getItem(0);
    }
}

 

ListView listView = new ListView();
List<String> list = new ArrayList();

listView.setAdapter(new ListAdapter(list));
listView.inflateView();
//省略使用ArrayAdapter,CursorAdapter代碼

 

若是是類適配器代碼怎麼實現?blog

public class ListAdapter<T>  extends List<T> implements IAdapter {

    ListAdapter(){
    }

    public int getCount() {
        //調用父類的size()
        return super.size();
    }

    public T getItem(int pos) {
        return super.get(pos);
    }

}
相關文章
相關標籤/搜索