對象適配器的「組合」比類適配器的「繼承」 更加靈活。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); } }