理解补充常见设计模式

来源:互联网 发布:软件数据接口 编辑:程序博客网 时间:2024/05/16 08:43

1.单例模式:

毋庸置疑,一个类只存在一个实例,除了静态方法获取实例之外,最重要的是这个类的构造方法要被显示声明成private类型,防止可以通过构造方法实例化。Android中体现在context.getSystemService()方法,调用的服务都是单例。

点击打开链接

2.Builder建造者模式:

它的构造过程一般很复杂,步骤繁多,但是顺序不固定。像Android的AlertDialog构建过程。

点击打开链接

3.外观模式

说白了就是你要去使用某些子系统的功能,但是你不会直接去和这些子系统打交道,产生一个类包含所有的子系统的操作,然后你只需要和这个类打交道即可。比如Android的ContextImpl实现,他调用了好多像ActivityManager等子系统的方法,像context.startActivity方法实际上是调用的 Instrumentation类的方法。

点击打开链接

4.模板方法

一个类对它的一些方法有自己的执行顺序,而且不能被改变,所以执行顺序已经确定,但是每个方法的方法体可能需要重新交给子类去重写,也可能不需要重写。像Android中的Activity的启动方法流程(onCreate、onResume...)和AsyncTask。

点击打开链接

5.适配器模式

一个类C中有一个适配器类A(抽象),会在这个类中调用A中的相关方法,然后为了实现不同的情况,这个适配器类需要被继承重写,假如我们需要一种情况实现,我们新建一个适配器类B(非抽象,继承自A),重写A的方法,那么C中调用的方法就变成了B的相应方法。Android中体现在ListView的各种adapter。

6.观察者模式

一个类观察者类持有所有的被观察者对象,当一个观察者状态变化时,会通知这个持有类做出改变。Android中一般处理双击退出时就会这样,持有所有Activity的对象,退出时统一关闭所有的Activity,或者当点击返回键时,通知持有者销毁这个Activity。

7.策略模式

所谓策略模式就是复杂版的if-else或switch-case,试想一下,如果if-else或者switch-case下的逻辑太复杂,代码会显得很臃肿且难以扩展。Android中的属性动画里的Interceptor,策略有AccessInterceptor、LinearInterceptor等。

点击打开链接

8.代理模式

就是在调用者和方法实现者之间再增加一个类A,这个A负责持有一个方法实现者的对象,调用者只需要创建代理者的实例,通过代理者调用方法实现者的方法。Android中的就是服务里面的Binder,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

点击打开链接

9.迭代器模式

实现Iterator接口,重写hasNext和next方法,可以订制自己的迭代器。

点击打开链接

10.责任链模式

就是一个请求 沿着一条链传递,知道请求被处理。责任人之间都持有一个下一级的引用,如果自己不能处理,那么会调用下一级的相关方法。Android中的UI触摸事件分发就是典型的责任链模式。

点击打开链接

11.命令模式

调用者和接收者分离,调用者不去亲自调用接收者的方法,而是发一个命令,每个命令都有自己的具体实现类,这个具体实现类里面去和接收者打交道,从而调用他的方法。

点击打开链接

12.桥接模式

 将抽象部分和实现部分分隔开。

点击打开链接

13.原型模式

当创建一个对象需要大量的准备工作时,直接克隆一个会更有效率,那么这就是原型模式,我们需要一个实现了Cloneable接口的类,然后重写clone方法,这个方法里,如果你选择直接给属性赋值(var2=var1),那么这就是浅拷贝,就是说拷贝这个对象的var2属性只是指向被拷贝对象的var1变量,如果你现在修改这个拷贝对象的var2,那么被拷贝对象的var1也会改变,这就是浅拷贝。如果想要深拷贝,那么假设var1和var2是ArrayList类型的(实现了cloneable接口的),我们在clone里面这样赋值:var2 = var1.clone(),则再次改变var2的内容,var1也不会受影响了。

点击打开链接