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());
…
}
}

装饰模式与代理模式的区别相关推荐

  1. 对设计模式的总结之装饰模式与代理模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  2. 装饰器模式和代理模式的区别

    转载自 装饰器模式和代理模式的区别 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是找了很多资料,想弄清 ...

  3. 装饰器模式与代理模式的区别_JS设计模式(三):装饰器模式、代理模式

    Do more 做的更多,比你上级给你安排的任务! 前言 在<不止代码>中提到了几个程序员典型的思维误区: 「 拜大牛为师 」「 业务代码一样很牛逼 」「 上班太忙没时间学习 」 我之前也 ...

  4. 适配器模式(包装模式)和代理模式的区别

    适配器模式(包装模式)和代理模式的区别 一.简介 适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而 ...

  5. 适配器模式 VS 装饰模式 VS 代理模式 一个狼外婆的故事串联起来

    适配器模式(连接):允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 装饰器模式(增强):原有的不能满足现有的需求,对原有的进行增强. 代理模式(限制): ...

  6. 装饰模式/适配器模式/代理模式

    装饰模式扩展既有对象的状态和功能,适配器模式实现不同接口的转换,代理模式某种意义上是通过第三方来进行对象的访问控制.监管. 四人帮: 装饰模式动态地给一个对象添加一些额外的职责.装饰模式使用组合代替继 ...

  7. 从一碗小米粥谈装饰器模式,代理模式的区别

    代理与装饰器 场景描述 代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范.代理模式和装饰器模式很像. 每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大 ...

  8. 设计模式 结构型模式 -- 装饰者模式(概述 快餐店案例 模式优点 使用场景 源码解析 BufferedWriter 和代理模式的区别)

    1. 装饰者模式 1.1 概述 我们先来看一个快餐店的例子: 快餐店有炒面.炒饭这些快餐,可以额外附加鸡蛋.火腿.培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得 ...

  9. C++设计模式::装饰模式or代理模式or面向切片编程(AOP)

    一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责.就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂件.屏 ...

最新文章

  1. union-find算法分析(2)
  2. php调用C代码的方法详解和zend_parse_parameters函数详解
  3. Python中变量的作用域?(变量查找顺序)
  4. NATS服务器部署及测试
  5. 矩阵连乘 动态规划 详解
  6. java 方法体 out 参数_Java方法详解
  7. 基于TCP和多线程实现无线鼠标键盘-Socket(1)
  8. springmvc从request中获取body的数据的方法
  9. *08TensorFlow2.0基础--8.3维度变换
  10. Linux下防火墙开启相关端口及查看已开启端口
  11. 解释清楚智能指针二【用自己的话,解释清楚】
  12. Thumbelina,摘自iOS应用Snow White and more stories
  13. Tableau:仪表板操作
  14. 职高计算机专业c语言_重庆市职业高中计算机专业C语言试题
  15. Ubuntu 16.04 Kalibr安装使用
  16. vivo手机安装应用提示未安装
  17. 折半插入排序顺序结构
  18. 中标麒麟5.0安装(内含安装包)-小白手把手史上最全教程!
  19. 亚马逊 Sessions 与 Pageviews 有什么区别?
  20. matlab 矩阵元素求和、求均值(期望)和均方差

热门文章

  1. Swift之深入解析类和结构体的本质
  2. RxSwift之深入解析如何创建Observable序列
  3. OpenGL ES之GLKit索引绘制“金字塔”及渲染纹理和颜色混合
  4. 为什么标准C++中两个直接字符串常量不能相加
  5. 1023:Hello,World!的大小
  6. PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
  7. 【Qt】Qt之网格布局
  8. 【ARM】ARM其它指令
  9. 只腐蚀毛刺 腐蚀算法_避坑干货!8大卫浴五金选购指南,只买对的不买贵的
  10. 行车记录仪设置php,【必看】如何正确的设置“行车记录仪”