安卓开发当中用到了各种各样的java设计模式,在此对其做以总结,一方面这是面试常考问题;另一方面,通过不断总结,也可以增强这方面的意识,知其然并知其所以然,方便日后灵活运用。
1,适配器模式
ListView、GridView、RecycleView等。
不同的数据提供者使用同一个适配器来向同一个客户提供服务。
2,建造者模式
AlertDialog.Builder
分步构造某一对象
3,命令模式
Handler.post之后通过Handler.handleMessage处理
把请求封装成一个对象发送出去,方便定制、排队、取消
4,享元模式
Message.obtainMessage 通过重用Message对象来避免大量Message对象被频繁创建和销毁
运用共享技术有效支持大量细粒度的对象
5,迭代器模式
Hashtable.elements方法得到一个enumeration,然后通过这个Enumeration访问Hashtable中的数据,不用关心数据存放方式
提供一个方法顺序访问数据集合中的所有数据而又不暴露对象的内部表示
6,备忘录模式
Activity的onSaveInstanceState和onRestoreInstanceState就是通过Bundle这种序列化的数据结构来存储Activity的状态,至于其中存储的数据结构,这两个方法不用关心
不需要了解对象内部结构情况下备份对象的状态,方便以后恢复
7,观察者模式
我们可以通过BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两个方法来向BaseAdapter注册、注销一个DataSetObserver。这个过程中,DataSetObserver就是一个观察者,它一旦发现BaseAdapter的内部数据有变,就会通过回调方法DataSetObserver.onInvalidated来通知DataSetObserver的实现类。事件通知也是观察者模式。
一个对象发生改变时,所有依赖于它的对象自动做相应改变。
8,原型模式
例如Bitmap的几种不同格式:ARGB_8888、RGB_565、ARGB_4444、ALPHA_8等。我们可以先创建一个ARGB_8888的Bitmap作为原型,在其基础上,通过调用Bitmap.copy(Config)来创建出其他几种格式的Bitmap。另外一个例子就是Java中所有对象都有的一个方法clone,堪称原型模式代名词。
在系统中要创建大量对象,这些对象之间几乎具有完全相同的功能,只是有点细节上的差别。
9,代理模式
类似于ios开发的delegate委托模式,所有的AIDL都是代理模式的例子。假设一个Activity A去绑定一个Service S,那么A调用S中的每一个方法其实都是通过系统的Binder机制的中转,然后调用S中对应的方法来做到的。Binder机制就起到了代理的作用。
为其他对象提供一种代理以控制对这个对象的访问。
10,状态模式
View.onVisibilityChanged方法,就是提供了一个状态模式的实现,允许在View的visibility发生改变时,引发执行onVisibilityChanged方法中的动作。
状态发生改变时,行为改变。
11,策略模式
java.util.List就是定义了一个增(add)、删(remove)、改(set)、查(indexOf)的策略,至于实现这个策略的ArrayList、LinkedList等类,只是在具体实现时采用了不同算法。但因为它们策略一样,不考虑速度的情况下,使用时完全可以互相替换使用。
定义一系列封装了算法、行为的对象,它们可以相互替换。
12,调解者模式
Resource.getDrawable方法实现逻辑是这样的:创建一个缓存来存放已经加载过的Drawable,如果getDrawable中传入的id对应的Drawable以前没有被加载过,那么它就会根据id所对应的资源类型,分别调用XML解析器生成,或者通过读取包中的图片资源文件来创建Drawable。而Resource.getDrawable把涉及到的多个对象、多个逻辑操作封装成一个方法,就实现了一个调解者的角色。
一个对象的某个操作需要调用N个对象的M个方法来完成时,把这些调用过程封装起来,就成了一个调解者。
13,抽象工厂模式
DAO与Service的使用