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


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册