GOF与安卓之——一个低调的工具类Decorator
安卓里面的装饰模式都实现得这么高大上,一个大写的服...
说它是工具类,是因为它是在utils目录下面的。
不过很显然,这样一个系统源码里的类不是开放给一般开发者的,仔细看路径里面,这个utils包属于hardware,而不属于common之类的,这也为这个类定下了基调:
“本类是谷歌工程师自己用的,高大上吊炸天,不是你们这些辣鸡随便能够看懂的”
Anyway,小编确实也没怎么看太懂,那就就这个类的名字分析一下decorator模式就好了
section 1 Decorator模式
先来看一下Decorator模式的定义
Gang of Four对其意图定义如下:
动态地给一个对象添加一些额外的职责
其核心内容集中在“动态”“对象”四字上面。说到“增加额外的职责”,熟悉面向对象的我们也许第一时间会想到另外两个字:“继承”,不过继承的方式显然是“静态”了,“额外的职责”会写死在各个子类里面。
我们可以这样理解“动态”与“对象”的关系:“动态”要求我们是为对象添加职责而不是为类添加职责;而单独为对象添加职责则需要我们以动态地方式添加。两者实际上是同一个概念。
section 2 一种辣鸡算法
有了“动态”这样的需求之后,我们需要找到实现的方式。
我们已经知道继承的方式必然无法满足需求,而关联相对于继承而言要更为灵活,让我们用关联尝试一下。
如下:
interface A
void doSomething();
class B implements A
void doSomething() {}
class DecoratorOfA implements A
A a;
void doSometingElse() {}
void doSomething() {
a.doSomething();
doSomethingElse();
}
简单理解一下上面的伪代码:
类B和装饰器DecoratorOfA之间并非继承关系,而是更为灵活的关联关系,需要被装饰的B的对象会成为DecoratorOfA 的成员,动态增加的职责是DecoratorOfA 的doSomethingElse()。
section 3 谷歌算法
上面是一种装饰模式的常规算法,不过谷歌这样的高大上公司对这样的辣鸡算法深感不屑(Just kidding on this)
正如其相机模块中的这个Decorator类,着实让小编理解了挺长时间。
先来看一下该类的介绍:
翻译一下:
这是使用java的代理机制实现的装饰模式
这句话至少告诉了我们两点信息:
1、这是一种装饰模式
2、采用代理机制实现,而非上文的关联模式
看来,有必要了解一下java的动态代理机制:通过代理对象完成对实际对象的访问,对客户隐藏实际对象。在实现上,代理对象Object a会通过反射机制获得实际对象b的接口。这样看来,这种做法恰恰可以满足对装饰模式的实现:代理对象作为装饰器,可以动态地为实际对象添加额外的职责。
来看一下关键代码
通过这个方法获取代理对象,即其返回的
这是代理对象所增加的接口,即“额外的职责”,具体做的事情可以酌情实现在不同的接口里面。
这是实现自interface InvocationHandler的方法,里面实现了具体的代理对象的接口调用。
动态代理机制的关键是类java.lang.reflect.Proxy和接口java.lang.reflect.InvocationHandler,此处就不展开了。
section 4 一句话总结一下
本文主要介绍装饰模式的概念以及两种实现方式,其中谷歌内部的实现用了java中相对高级的特性:反射机制、动态代理
扫描二维码或长按以解析二维码关注本账号哦亲
狮兄狮妹们捧个人场
各位总们捧个钱场
就酱^_^
关注 CoderX
微信扫一扫关注公众号