GOF与安卓之——好的模块要有一张帅气的脸:Facade模式

 

一个好的模块肯定有好的对外接口,即模块的“脸”,Facade模式便是定义一个模块“脸”的良好模式。...



section 1 一个悖论

一个好的模块要有什么样的特性?一是强大,二是好用。

不过这两者似乎有些不可调和的矛盾:功能越强大则用起来会相对越复杂,而过分追求易用性则会一定程度上制约功能。因而,在设计模块的过程中需要一些技巧来权衡两者之间的关系。

这些技巧,从大的方面来说有面向对象、解耦合、kiss法则等,从设计模式上来说,也有一些模式有所帮助。正如本文的主角——Facade模式,就是其中之一

section 2 Facade模式

继续上面的话题,我们考虑当前有一个功能强大的模块名为A,其主要功能分别由a,b,c,d,e五个子系统实现,client B需要使用模块A的主要功能,此时依赖关系如下



如图所示,对于B来说,维持对过多子系统的访问增加了编程的复杂度;而对于A来说,过多子系统的暴露不利于系统的封装性。

为了解决这两个问题,我们为A增加一层接口facade,由facade向B提供访问A各个子系统的接口,如下



这便是Facade模式的核心内容,使用Facade模式可以:为一个复杂子系统提供一个简单接口,提高子系统的独立性;在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

section 3 安卓中的Facade模式

和许多其他设计模式一样,Facade模式在安卓中也得到了广泛应用。

Context算一个,安卓通过Context接口为程序提供访问系统各(子)模块的入口,从而避免程序直接访问各子模块会导致的各种问题。(编码复杂性/权限问题/安全问题等)

一些系统子模块的实现与Facade模式更为契合,如Media Framework,其基本框架如下:



OpenCore是安卓多媒体模块的核心,实现了音视频采集/播放等功能,满足我们在section 1里的假设“功能强大”。OpenCore内部由许多子模块组成,子模块分别实现不同的功能

而对于安卓应用开发者而言,安卓的多媒体模块可以用两个类来概括:MediaPlayer和MediaRecoder,它们即为多媒体模块的Facade,隐藏了多媒体模块各子模块细节。

在安卓的系统架构中,还有很多功能模块



其中大都按照这样的框架进行设计:

java API调用jni接口,jni接口调用功能模块的各子模块来完成工作。可以说,安卓系统的整体框架也和Facade模式有着很深的联系。

section 4 总结一下

本文简单介绍了Facade模式,即外观模式的基本概念和实现,同时介绍了安卓系统中对Facade模式的使用。

一句话总结:Facade模式——功能模块的一张脸



扫描二维码或长按以解析二维码关注本账号哦亲

狮兄狮妹们捧个人场

各位总们捧个钱场

就酱^_^


    关注 CoderX


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册