代理模式 vs 装饰模式

Posted zzfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式 vs 装饰模式相关的知识,希望对你有一定的参考价值。

代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

 

代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的。下面分别讲解代理模式和装饰模式。

1、代理模式

  一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理人就可以了。类图如下所示:

 

IRunner接口如下:

 

Runner类如下所示:

 

RunnerAgent代理类如下:

复制代码

复制代码

测试场景如下:

复制代码

复制代码

输出结果为:

 或者

 

2、装饰模式

  面对代理模式中的场景,使用装饰模式如何实现呢?装饰模式是对类功能的加强,比如增强跑步速度,安装一个动力装置等。类图如下所示:

是不是和代理模式的类图一模一样,其实是一样的,但是实现的意图是一样的,先看代码:

复制代码

复制代码

测试场景如下:

复制代码

复制代码

输出结果如下:

 

3、二者的比较

  通过上述的例子可以看出,代理模式和装饰模式非常类似,甚至代码都类似。二者最主要的区别是:代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,仅此而已。

  代理模式使用到极致开发就是AOP, 这是各位采用Spring架构开发必然要使用到的技术(Spring学习之第一个AOP程序),它就是使用了代理和反射的技术。代理模式在Java的开发中俯拾皆是, 是大家非常熟悉的模式, 应用非常广泛, 而装饰模式是一个比较拘谨的模式, 在实际应用中接触比较少, 但是也有不少框架项目使用了装饰模式, 例如在JDK的java.io.*包中就大量使用装饰模式, 类似如下的代码:

 

  这是装饰模式的一个典型应用, 使用DataOutputStream封装了一个FileOutputStream, 以方便进行输出流处理。

 

https://www.cnblogs.com/luoxn28/p/5535877.html

以上是关于代理模式 vs 装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

装饰模式与代理模式的区别

设计模式 结构型模式 -- 结构型模式(代理模式适配器模式装饰者模式桥接模式外观模式组合模式享元模式)

跟我学设计模式视频教程——适配器模式,适配器模式VS装饰模式

Java 代理模式和装饰者模式的区别

代理模式、装饰者模式

代理模式