对象适配器的“组合”比类适配器的“继承” 更加灵活。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); } }