Pattern-Oriented Software Architecture, Patterns for Concurrent and Networked Objects, Volume 2, 详细读书笔记 2

来源:互联网 发布:php程序员 编辑:程序博客网 时间:2024/05/01 19:45


(注:以后的笔记中,我都尽量不采用直接翻译的方式,那样太费功夫了,毕竟这是读书笔记。我尽量将我理解到的意思写出来,只是做重要部分的摘译,有的次要部分,我还是直接跳过:)。)
2.2[Wrapper Facade]
Wrapper Facade设计模式,将已存在的非面向对象APIs提供的函数和数据封装成简洁、健壮、可移植、可维护且内聚性更强的面向对象类接口。
[例子]
……
[page 49]
(讲了一个远程日志系统,通常采用底层API,用一些如c语言的函数一样的方法调用底层功能,实现如线程、同步、网络连接等等功能。如果需要此日志系统支持跨平台,则惨了,移植性太差,要用C/C++中的#ifdef等宏来控制是否打开特定平台的代码。接着也用c语言show了一段典型的代码实例[page 50-51],让你看看这种宏有多烦人。我就不摘录了:))
[page 52]
(code: blah...blah..)
(继续讲这种代码的坏处:不容易理解,调试、移植、维护、演进都很困难。)
(采用分离的配置头文件,能减轻采用条件编译指令所带来的问题,却不能完全解决问题,因为照样有由#ifdef区分的平台相关的代码污染应用程序。)
(还有别的一些著名模式致力于解决类似问题,如:[GOF95]中的Facade,Decorator,Brider 和 Adapater,但这些都并不是对底层非面向对象API进行封装。)

[上下文(context)]
由已存在的非面向对象API提供访问机制或服务,要构建出可维护且可演进(evolvable)的应用程序。

[问题]
应用程序经常使用非面向对象的操作系统API或系统库,通过这些API或库能访问网络、线程、界面、数据库等等资源。虽然这种设计比较普遍,但是也引起了很多问题:
    - 用底层API,程序员重复地写大量繁琐的、易错的程序代码。面向对象语言能提供更高层特性,可减少程序开发中可能的错误,避免重复代码,……。
        (如:在上面的日志代码例子中,main()内的socket相关代码可引起很多微妙的错误,且资源的分配和释放都不好管理。)
[page 53]
    - 采用底层API,不可在不同的操作系统、编译器、硬件平台之间移植,……。
        (如:日志例子中,使用了很多不可移植的C API,如:thr_create(), mutex_lock()和 mutex_unlock())
    - 采用底层非面向对象API的程序难于维护,……。
        (拿例子说事)
    - 底层API缺乏内聚性,不好组织,通常功能分布整个应用程序中,不易扩展新功能,不利于学习、维护,……。
        (拿例子说事)
[page 54]
    总之,在开发应用程序时直接采用非面向对象的API来编程,对于以后需要维护和演进的软件来说是非常拙劣的设计。

[解决方案]
避免直接访问非面向对象的API。对于这些API中功能相关的一套函数和数据,都创建一个或多个wrapper facade类去把他们封装成简洁、健壮、可移植、可维护且内聚性更强的面向对象类(接口)。

[结构]
Wrapper Facade模式有两个参与者:
    - Function 是已有的非面向对象API的building blocks(??),提供独立的服务或机制,维护传递的参数数据或通过全局变量访问的数据。
    - Wrapper Facade 是一套面向对象类,封装了已有的函数及函数所访问的数据,这些类对外提供了内聚的(cohesive,笔者注:模块内部各成分之间相关联的)特定功能抽象,每个类表示了抽象中的一个特定角色。

Wrapper Facade类中的方法通常将应用程序的调用转发给一个或多个function。数据是作为参数传递给function的,且数据经常隐藏在Wrapper Facade的私有部分中,客户端是不能访问的。封装在Wrapper Facade中的如指针或整型这样的原始数据类型通常都是强类型,编译器能强化类型安全性。
[图](Wrapper Facade 和 API Function的CRC图)
下图展示了Wrapper Facade的结构:
[page 55]
[图]

[动态(Dynamic)]
Wrapper Facade中的协作通常很简单:
    - 应用程序调用Wrapper Facade实例的方法。
    - Wrapper Facade将请求和参数传递给它封装的一个或多个底层API,并将底层function所需要的任何内部数据传给它。
[图](展示Wrapper Facade的协作的sequence图)

原创粉丝点击