关于Android中的设计模式
开发有技巧,也有思维,设计模式就是以一种抽象的解决一类问题的思维方式。初次接触设计模式是在学习Java的时候,那时候还是一知半解,基本了解有哪些名词,但是真的自己运用起来就傻眼了。学了Android以后对其中常用的设计模式有了更深刻的认识。
Android本身的设计模式
单例模式
1. 模式介绍
模式的定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
模式的使用场景
确保某个类有且只有一个对象的场景,例如创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源。
2. UML类图
3.Android中的实现
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用Application。
Builder/建造者模式
1. 模式介绍
模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式的使用场景
1.相同的方法,不同的执行顺序,产生不同的事件结果时;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
2. UML类图
3.Android中的实现
在Android源码中,我们最常用到的Builder模式就是AlertDialog.Builder, 使用该Builder来构建复杂的AlertDialog对象。简单示例如下 :
//显示基本的AlertDialog
private void showDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon);
builder.setTitle("标题");
builder.setMessage("这是一个Dialog");
builder.setPositiveButton("确认",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("点击了对话框上的确认");
}
});
builder.setNeutralButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("点击了对话框上的取消");
}
});
builder.setNegativeButton("忽略",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("点击了对话框上的忽略");
}
});
builder.create().show(); // 构建AlertDialog, 并且显示
}
Dialog中的Title,Message,Icon等都是在构建的时候设置的。
适配器模式
1. 模式介绍
模式的定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
模式的使用场景
adapter在英文中有插座,转换器的意思,起到电源接口的作用。在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。
2. UML类图
上图为类适配器模式,类适配器是通过实现Target接口以及继承Adaptee类来实现接口转换。
上图为对象适配器模式,对象适配器模式则是通过实现Target接口和代理Adaptee的某个方法来实现。
3.Android中的实现
在开发过程中,ListView的Adapter是我们最为常见的类型之一。一般的用法大致如下:
// 代码省略
ListView myListView = (ListView)findViewById(listview_id);
// 设置适配器
myListView.setAdapter(new MyAdapter(context, myDatas));
// 适配器
public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
List<String> mDatas ;
public MyAdapter(Context context, List<String> datas){
this.mInflater = LayoutInflater.from(context);
mDatas = datas ;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public String getItem(int pos) {
return mDatas.get(pos);
}
@Override
public long getItemId(int pos) {
return pos;
}
// 解析、设置、缓存convertView以及相关内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// Item View的复用
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.my_listview_item, null);
// 获取title
holder.title = (TextView)convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText(mDatas.get(position));
return convertView;
}
}
ListView中的适配器相当于在数据源和View控件之间起到了转换器的作用,使用的时候最重要的就是getView的复写,这里定义了数据和View之间的绑定关系。
观察者模式
1. 模式介绍
模式的定义
对象之间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
模式的使用场景
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
2. UML类图
观察者模式中又分为推模型和拉模型
推模型
主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。
拉模型
主题对象在通知观察者的时候,只传递少量信息
如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据
一般这种模型的实现中,会把主题对象自身通过 update 方法传递给观察者。
这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。
3.Android中的实现
Android中各种控件的监听事件就是典型的观察者模式
//返回按钮
backButton = (Button)findViewById(R.id.btn_back);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//做一些界面更新操作
}
});
其中的OnClickListener就是一个观察者,观察的对象是backButton,当backButton被点击的时候就会回调这个onClick方法,方法内部就可以写具体的界面更新等操作了。控件状态的监听是Android开发中经常见到的,类似的还有ListView的OnItemClickListener等等。
Android中还有很多设计模式,但是学习过程中有的还没有认真研究过。更多详细的介绍看这篇博客
Android源码设计模式分析一期发布