现在的位置: 首页 > 综合 > 正文

设计模式推演——装饰已有对象(Proxy/Decorator)

2013年01月19日 ⁄ 综合 ⁄ 共 1287字 ⁄ 字号 评论关闭

上一篇文章中,我们提到OO中复用的方式有两种,组合和继承。一般情况下,应该尽可能使用组合的方式。现在以复用为基本需求,推演若干常见组合型模式

1. Decorator模式

 需求:我们已经有一群对象,现在想统一为这些对象添加若干新特性。更重要的是,这些新特性可以反复叠加于某个对象,或者只选择部分特性作用于某个对象

条件:如果这个特性的实现不依赖于具体的对象,就如同添加一个装饰,那么可以应用Decorator模式。

如果基于开闭原则出发,实际上就是要求不修改已有的对象,通过为每一个新特性实现一个Decorator类来实现扩展(使用的方式是组合)。

应该说:Decorator的使用条件是异常苛刻的,因为每一个Decorator类要求可装饰于任意的对象,这些对象可以是现在已经存在的,同时包括那些未来时的。

2. Proxy模式

Proxy模式有点类似于Decorator模式,也是为已有类的行为做些新的装饰。所不同的是,Proxy模式一般只是为一个对象作装饰,且这些装饰不会相互组合叠加

从开闭原则出发,Proxy与Decorator模式相同,都是要求不修改已有的对象,通过组合的方式,新建一个Proxy类来扩展原有对象的功能。

Proxy模式是典型的中间层技术,以Proxy对象作为中间层,代替原始对象,从而提供一种更灵活的设计方式。

对代理模式,常见的应用情景是权限和访问控制:

1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。
2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。

3.  Decorator模式 /Proxy模式与重构

如果原始代码没有使用Decorator模式 /Proxy模式,那么大多数情况下基本是使用了继承+多态的方式实现,就这种情况而言,可以使用Replace Inheritance with Delegate重构方法。

最后想说明的是,

1. 这两个模式的应用时机

虽然这两个模式是都是装饰已有对象的行为,但是一般设计之初我们可能就已经有意的引入这两个模式。

2. 为什么不是多态,而是组合

首先,使用多态总是可以实现需求的,但正如之前文章中所论述的,应该尽可能使用组合。

第二,这两个模式的主要特点是装饰,通过装饰,将对象的主要行为由原始对象体现,将对象的一些别致行为由装饰对象或者代理对象实现。

这样的设计更满足单一职责原则。

3. 为什么说是装饰已有行为?

没有增加新的接口;改变了原有接口的效果;

抱歉!评论已关闭.