适配器模式(对象适配器)

fcf7ab48a261a0938a4f0877fed4a0577f6.jpg

对象适配器的“组合”比类适配器的“继承” 更加灵活。

定义:

将一个类的接口转换成客户希望的另外一个接口。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);
    }

}

 

转载于:https://my.oschina.net/u/4129361/blog/3051024

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值