代理模式 vs 装饰模式
代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的。下面分别讲解代理模式和装饰模式。
1、代理模式
一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理人就可以了。类图如下所示:

IRunner接口如下:
public interface IRunner {
public void run();
}
Runner类如下所示:
public class Runner implements IRunner {
@Override
public void run() {
System.out.println("运动员在跑步...");
}
}
RunnerAgent代理类如下:
public class RunnerAgent implements IRunner {
private IRunner runner;
public RunnerAgent(IRunner runner) {
this.runner = runner;
}
@Override
public void run() {
Random rand = new Random();
if (rand.nextBoolean()) {
System.out.println("代理人安排运动员跑步...");
runner.run();
}
else {
System.out.println("代理人有事情,不安排运动员跑步了...");
}
}
}
测试场景如下:
public class Main {
public static void main(String[] args) {
IRunner runner = new Runner();
IRunner agent = new RunnerAgent(runner);
System.out.println("有人请求代理人让运动员跑步...");
agent.run();
}
}
输出结果为:
或者
2、装饰模式
面对代理模式中的场景,使用装饰模式如何实现呢?装饰模式是对类功能的加强,比如增强跑步速度,安装一个动力装置等。类图如下所示:

是不是和代理模式的类图一模一样,其实是一样的,但是实现的意图是一样的,先看代码:
public class RunnerWithJet implements IRunner {
private IRunner runner;
public RunnerWithJet(IRunner runner) {
this.runner = runner;
}
@Override
public void run() {
System.out.println("给运动员屁股后加一个推进装置...");
runner.run();
}
}
测试场景如下:
public class Main {
public static void main(String[] args) {
IRunner runner = new Runner();
IRunner superRunner = new RunnerWithJet(runner);
System.out.println("有人请求加强版运动员跑步...");
superRunner.run();
}
}
输出结果如下:

3、二者的比较
通过上述的例子可以看出,代理模式和装饰模式非常类似,甚至代码都类似。二者最主要的区别是:代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,仅此而已。
代理模式使用到极致开发就是AOP, 这是各位采用Spring架构开发必然要使用到的技术(Spring学习之第一个AOP程序),它就是使用了代理和反射的技术。代理模式在Java的开发中俯拾皆是, 是大家非常熟悉的模式, 应用非常广泛, 而装饰模式是一个比较拘谨的模式, 在实际应用中接触比较少, 但是也有不少框架项目使用了装饰模式, 例如在JDK的java.io.*包中就大量使用装饰模式, 类似如下的代码:
OutputStream out = new DataOutputStream( new FileOutputStream( "test.txt") )
这是装饰模式的一个典型应用, 使用DataOutputStream封装了一个FileOutputStream, 以方便进行输出流处理。
参考资料:
1、《设计模式之禅》机构类模式大PK章节
代理模式 vs 装饰模式的更多相关文章
- 设计模式:代理模式 vs 装饰模式
参考文章:https://www.cnblogs.com/luoxn28/p/5535877.html 代理模式和装饰模式非常类似,甚至代码都类似. 二者最主要的区别是: 代理模式中,代理类对被代理的 ...
- 【设计模式】 模式PK:代理模式VS装饰模式
1.概述 对于两个模式,首先要说的是,装饰模式就是代理模式的一个特殊应用,两者的共同点是都具有相同的接口,不同点则是代理模式着重对代理过程的控制,而装饰模式则是对类的功能进行加强或减弱,它着重类的功能 ...
- JAVA设计模式:代理模式&& 装饰模式区别
在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解: 装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖. public in ...
- C#设计模式系列:代理模式(Proxy)
代理模式提供了一个中介控制对某个对象的访问.现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理. 1.代理模式简介 1.1>.定义 代理模式(Proxy)定义:代理模 ...
- 我学的是设计模式的视频教程——装饰图案,装饰图案VS代理模式
课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.
- 设计模式之(十一)代理模式(Proxy)
软件开发行业有一个观点:任务问题都可以添加一个中间层来解决.代理模式也是这个思想下的产物. 首先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.就是把类委托给另外一个类,用这个类来控 ...
- Matlab代理模式
代理模式(Proxy)就是给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用.代理模式和装饰模式非常类似,但最主要的区别是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行.本 ...
- Spring中常用的设计模式之:代理模式
看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以 ...
- 适配器模式,装饰模式,代理模式异同<转>
节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式. 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清. 今天再重新学习下,把学习心得分享给大家一下 ...
随机推荐
- Owl Carousel – 支持触摸的 jQuery 响应式传送带插件
Owl Carousel 是一个 jQuery 插件,使我们能够迅速地创建响应式传送带滑块.这个插件是触摸友好的,能与几乎任何的 HTML 内容兼容使用.另外,强大的选项设置支持分页/滑动速度,启用/ ...
- 值得 Web 开发人员收藏的16款 HTML5 工具
HTML5 正在迅速改变创建和管理网站的方式.HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5 开发各种网站和应用程序. ...
- JavaScript数组与对象的关系
JavaScript的数组,相比其他语言,是比较特殊的.数组是Object类型,只不过,有几个比较特殊的地方: 有索引下标 有默认的length属性 是有序的(注意,对象是无序的) 可以使用一些特殊的 ...
- 原生JS:Math对象详解
Math对象 本文参考MDN做的详细整理,方便大家参考MDN Math 也是一个内置对象, 为数学常量和数学函数提供了属性和方法,而不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造 ...
- (转)JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce)
JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce) 函数节流,简单地讲,就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过 ...
- getDate()返回日期不一致问题引发的bug
问题描述 最近在webapp的开发中遇到一个Date对象中getDate获取日期的兼容性问题,Date对象的getDate方法返回的日期和传入的日期不一致,例如: 在android 4.3以下版本,g ...
- 通过GP加载卫星云图-雷达图-降雨预报图
# ---------------------------------------------------------------------------# MeteorologicalImageLo ...
- Jquery分页功能
Jquery代码 /// <reference path="jquery-1.9.1-vsdoc.js" />//锚点var anchor="#apage&q ...
- TexturePacker大图还原成小图工具带源码
TexturePacker是一个把好多小图打成大图的软件,生成的是大图以及小图在大图位置的.plist描述文件,但是不支持把大图还原成小图.网上偷的图一般都是大图和plist,想得到小图比较麻烦,于是 ...
- GitHub 上有哪些完整的 iOS-App 源码值得参考?
1. Coding iOS 客户端 Coding官方客户端. 笔者强烈推荐的值得学习的完整APP.GitHub - Coding/Coding-iOS: Coding iOS 客户端源代码 2. OS ...