代码改变世界

外观模式和代理模式(学习笔记)

2010-05-20 09:32  chenbw  阅读(2106)  评论(1)    收藏  举报

注:主要参考一些博客园博主资料,在此表示感谢。链接随后补上

主要内容:

1. 外观模式(门面模式)

场景:

一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。

按照我们正常的设计:

clip_image002

用了外观模式:

clip_image004

外观模式:

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

clip_image005

应用场景:

a) 为一个复杂子系统提供一个简单接口.

b) 提高子系统的独立性.

c) 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

注意点:

a) 一个系统可以有几个门面类: 在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类。

b) 为子系统增加新行为:通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为,只能直接修改门面类。

2. 代理模式:

意图:

通过为对象加一个代理来控制对象的使用,比如:降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率。还有一些情况,一个客户不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理种类:

如果按照使用目的来划分,代理有以下几种:

a) 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。

b) 虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。

c) Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

d) 保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。

e) Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

f) 防火墙(Firewall)代理:保护目标,不让恶意用户接近。

g) 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

h) 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

UML图:

clip_image006

3. 总结:

Proxy、Facade以及Adapter可能都是对对象的一层封装,侧重点不同。

Proxy基于一致的接口进行封装,接口必须一致,只是对访问进行控制。

Facade针对封装子系统,转化为高层接口,

Adapter的封装是处于适配接口的目的。

5.下次内容:桥接模式(Bridge)和组合模式(Composite),

6.下下次内容:享元模式(FlyWeight)和结构性模式总结(重在对比)