Android常用8种设计模式(三)

抽象类BaseAdapter,我省略其他代码,只列出两个方法,以作示意:

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {

// … …

public View getDropDownView(int position, View convertView, ViewGroup parent) {

return getView(position, convertView, parent);

}

public boolean isEmpty() {

return getCount() == 0;

}

}

ArrayAdapter对List进行封装成ListAdapter的实现,满足ListView的调用:

public class ArrayAdapter extends BaseAdapter implements Filterable {

private List mObjects;

//我只列出这一个构造函数,大家懂这个意思就行

public ArrayAdapter(Context context, int textViewResourceId, T[] objects) {

init(context, textViewResourceId, 0, Arrays.asList(objects));

}

private void init(Context context, int resource, int textViewResourceId, List objects) {

mContext = context;

mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

mResource = mDropDownResource = resource;

mObjects = objects; //引用对象,也是表达了组合优于继承的意思

mFieldId = textViewResourceId;

}

public int getCount() {

return mObjects.size();

}

public T getItem(int position) {

return mObjects.get(position);

}

public View getView(int position, View convertView, ViewGroup parent) {

return createViewFromResource(position, convertView, parent, mResource);

}

// … …

}

我们就如此成功的把List作为数据源以ListView想要的目标接口的样子传给了ListView,同理CursorAdapter也是一模一样的道理,就不写具体代码了。

适配器本身倒是不难,但是提供了解决不兼容问题的惯用模式。

关于什么时候使用适配器模式,大概有三种情况:

(1). 你想使用一个已经存在的类,而它的接口不符合你的需求,这个在处理旧系统时比较常见。

(2). 你想创建一个可以复用的类,该类可以和其他不相关的类或不可预见的累协同工作,这就是我们android开发者经常碰到的情况:我们常常自定义一个新的Adapter。

(3). 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口,对象适配器可以适配他的父类接口。

3.效果

1. 结构性模式

2. 上面论述的主要是对象适配器,关于类适配器除了实现目标端口外,还要实现你要兼容的源类,

这样可以少写几行代码,但是从组合优于继承的角度看,它总则没有那么的干净。

3. 对同一个适配器(即同一个对象)对同样的源进行双向甚至多向的适配,则能使其适用两个甚至多个客户调用。

Android中对组合(合成)模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。

组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。

1.意图

将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分)。

组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。

热点词汇: 部分-整体 容器-内容 树形结构 一致性 叶子 合成 安全性 透明性

2.结构

针对View和ViewGroup的实际情况,我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),添加少许的注释,我们把上图修改为:

3.代码

View类的实现:

​public class View{

//… …

//省略了无关的方法

}

public abstract class ViewGroup extends View{

/**

  • Adds a child view.

*/

public void addView(View child) {

//…

}

public void removeView(View view) {

//…

}

/**

  • Returns the view at the specified position in the group.

*/

public View getChildAt(int index) {

try {

return mChildren[index];

} catch (IndexOutOfBoundsException ex) {

return null;

}

}

//other methods

}

ViewGroup的实现:

4.效果

(1).结构型模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值