装饰模式与代理模式的区别
http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html
学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是 找了很多资料,想弄清楚这两者之间到底有什么区别。结果发现这一篇英文文章讲的很清晰,就翻译一下,供参考。
首先,让我们先看一下下面的这两个UML类图,他们分别描述了装饰器模式和代理模式的基本实现。
这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。
然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
代理模式:
//代理模式 public class Proxy implements Subject{ private Subject subject; public Proxy(){ //关系在编译时确定 subject = new RealSubject(); } public void doAction(){ …. subject.doAction(); …. } }
//代理的客户 public class Client{ public static void main(String[] args){ //客户不知道代理委托了另一个对象 Subject subject = new Proxy(); … } }
装饰模式:
//装饰器模式 public class Decorator implements Component{ private Component component; public Decorator(Component component){ this.component = component } public void operation(){ …. component.operation(); …. } }
//装饰器的客户 public class Client{ public static void main(String[] args){ //客户指定了装饰者需要装饰的是哪一个类 Component component = new Decorator(new ConcreteComponent()); … } }
装饰模式与代理模式的区别相关推荐
- 对设计模式的总结之装饰模式与代理模式
前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...
- 装饰器模式和代理模式的区别
转载自 装饰器模式和代理模式的区别 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是找了很多资料,想弄清 ...
- 装饰器模式与代理模式的区别_JS设计模式(三):装饰器模式、代理模式
Do more 做的更多,比你上级给你安排的任务! 前言 在<不止代码>中提到了几个程序员典型的思维误区: 「 拜大牛为师 」「 业务代码一样很牛逼 」「 上班太忙没时间学习 」 我之前也 ...
- 适配器模式(包装模式)和代理模式的区别
适配器模式(包装模式)和代理模式的区别 一.简介 适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而 ...
- 适配器模式 VS 装饰模式 VS 代理模式 一个狼外婆的故事串联起来
适配器模式(连接):允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 装饰器模式(增强):原有的不能满足现有的需求,对原有的进行增强. 代理模式(限制): ...
- 装饰模式/适配器模式/代理模式
装饰模式扩展既有对象的状态和功能,适配器模式实现不同接口的转换,代理模式某种意义上是通过第三方来进行对象的访问控制.监管. 四人帮: 装饰模式动态地给一个对象添加一些额外的职责.装饰模式使用组合代替继 ...
- 从一碗小米粥谈装饰器模式,代理模式的区别
代理与装饰器 场景描述 代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范.代理模式和装饰器模式很像. 每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大 ...
- 设计模式 结构型模式 -- 装饰者模式(概述 快餐店案例 模式优点 使用场景 源码解析 BufferedWriter 和代理模式的区别)
1. 装饰者模式 1.1 概述 我们先来看一个快餐店的例子: 快餐店有炒面.炒饭这些快餐,可以额外附加鸡蛋.火腿.培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得 ...
- C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责.就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂件.屏 ...
最新文章
- union-find算法分析(2)
- php调用C代码的方法详解和zend_parse_parameters函数详解
- Python中变量的作用域?(变量查找顺序)
- NATS服务器部署及测试
- 矩阵连乘 动态规划 详解
- java 方法体 out 参数_Java方法详解
- 基于TCP和多线程实现无线鼠标键盘-Socket(1)
- springmvc从request中获取body的数据的方法
- *08TensorFlow2.0基础--8.3维度变换
- Linux下防火墙开启相关端口及查看已开启端口
- 解释清楚智能指针二【用自己的话,解释清楚】
- Thumbelina,摘自iOS应用Snow White and more stories
- Tableau:仪表板操作
- 职高计算机专业c语言_重庆市职业高中计算机专业C语言试题
- Ubuntu 16.04 Kalibr安装使用
- vivo手机安装应用提示未安装
- 折半插入排序顺序结构
- 中标麒麟5.0安装(内含安装包)-小白手把手史上最全教程!
- 亚马逊 Sessions 与 Pageviews 有什么区别?
- matlab 矩阵元素求和、求均值(期望)和均方差
热门文章
- Swift之深入解析类和结构体的本质
- RxSwift之深入解析如何创建Observable序列
- OpenGL ES之GLKit索引绘制“金字塔”及渲染纹理和颜色混合
- 为什么标准C++中两个直接字符串常量不能相加
- 1023:Hello,World!的大小
- PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
- 【Qt】Qt之网格布局
- 【ARM】ARM其它指令
- 只腐蚀毛刺 腐蚀算法_避坑干货!8大卫浴五金选购指南,只买对的不买贵的
- 行车记录仪设置php,【必看】如何正确的设置“行车记录仪”