首页 » 设计与架构 » 正文

代理模式(Proxy)和装饰者(Decorator)模式的区别

想必大家每个开发人员都懂得设计模式,也都用过设计模式,感觉追捧设计模式就像武林中的剑宗只重视剑法,而不重视气功的修炼,例如,很多人知道代理模式,也知道装饰者模式,如果把这两个模式放在一起,对比下UML图,就会发现,两者的结构惊人的相似,所以又很少有人说出两者的区别,本文仅仅通过对比代理模式(Proxy)和装饰者(Decorator)模式,帮助大家更深入的理解设计模式,让剑法和气功集于一身,成为武林高手将指日可待。

要学习代理模式和装饰者模式,请参考这位仁兄的博客:

设计模式之五 — 代理模式(Proxy)
设计模式之八 — 装饰者模式(Decorator)

下面的两张UML图也来自这位仁兄的博客:

Decorator

Proxy

从上面这两张UML图可以看出,代理模式和装饰者模式从结构上基本完全相同,不考虑上图中装饰者模式的装饰类使用了一个抽象类,其他结构完全相同,因此从结构上没法区分这两个模式,因此我们不能拘泥于类关系是如何实现上,而我们就应该从设计模式本身具有的特点,应用场景,使用方法上来区分,其实,不同的模式有不同的关注点和侧重点。

总结如下:

1. Proxy模式关注的代理两个字,是类的代理,也就是一个类的整体代理,一个原始类可能有多个方法,使用代理类,就要尽量对原始类大部分方法从同一个功能触发进行代理,比如权限代理,连接池管理,进而可以发展到动态代理以及AOP,过滤器,Hook等;

  而Decorator则侧重于增加职责,至于为一个类多个方法增加的职责是否统一不是其关心的,可能不同方法不同职责;

  总之,代理模式侧重于控制原有的类实现,而装饰者模式侧重于增加新的功能,至于新的功能和原有实现的关系不那么重要。

2. 方法粒度不一样,装饰模式一般只是对特定行为方法增加额外职责;

  而代理模式则是所有方法增加新职责并提供对原有实现的控制,而且这个新职责是一个方面或一系列的。

3. 代理模式有远程代理等作用,可以起到一些特殊功能,上升到了系统的拓扑结构,是动态的,而装饰模式只是一种结构上设计罢了,看起来是静态的。

最后,我更倾向于将这两种模式和职责链模式以及AOP, Hook等同归为“过滤器”,是一种动态可插拔概念的设计,符合当今业务层动态组件设计要求,都可以用来提供灵活可扩展可伸缩的架构。