对象适配器的“组合”比类适配器的“继承” 更加灵活。
定义:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式最经典的应用应该就是android中的ListView,GridView了。
举个栗子:
假如你是android framework的开发工程师,要设计一个ListView组件来展示数据,数据源的类已经定义好了而且不能被改动(开闭原则),比如String[],ArrayList,Cursor(这些都是adaptee,被适配者)等,但是这三个数据源(ITarget)的访问数据接口并不是统一的,要想获取数据源的长度,String数组是length属性,ArrayList是size(),Cursor是getCount();所以我这么这个时候需要抽象出来一个适配器。(ArrayAdapter,ListAdapter,CursorAdapter)
首先定义ListView需要的接口.
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,可以是任意对象的数组)
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代码
如果是类适配器代码怎么实现?
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);
}
}