设计模式-修饰模式和代理模式的区别

发布于 2017-01-30 10:33:35 字数 63 浏览 1368 评论 3

在设计模式中,看修饰模式和代理模式的时候,觉得说的差不多,这两者之前有什么明显区别或者应用场景有什么突出不同么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-09-26 07:47:13

修饰模式
动态继承,让类具有在运行期改变行为的能力,一个类可能在不同的运行阶段表现出不同的行为,但是又不需要在某一个特定的阶段让他具备all行为,这时就要用到修饰模式。

例如
某对象有30项行为,但是在第一阶段用到1-20行为,第二阶段用到11-30项行为
这时候base就可以只定义11-20的行为
在第一阶段运行时,可以将1-10的行为以“装饰1”给加上
到第二阶段运行时,可以将“装饰1”去掉,将21-30的能以“装饰2”给加上。

修饰模式,突出的是运行期增加行为,这和继承是不同的,继承是在编译期增加行为。

代理模式
1. 从封装的角度讲, 是为了解决类与类之间相互调用而由此导致的耦合关系,可以说是接口的另外一层引申,在a类->b代理->c类的关系中,对于a类,c类的一切行为都掩藏在b
2. 从复用的角度讲, 可以解决不同类调用一个复杂类时,仅仅因较小的改变而导致整个复杂类新建整个类,例如 a类->c类1 b类->c类2 可以变成 a类->ca代理->c类 b类->cb代理->c类

简单而言,修饰模式是动态继承,代理模式是类之间的封装和(某个方面的)复用

清晨说ぺ晚安 2017-07-02 10:53:04

修饰模式和代理模式的作用是不同的。

核心区别简单的说就是

*修饰模式会对base类定义的接口进行一定的modify
*代理模式则不会,只会实现这个接口

从一定意义可以理解,代理模式是修饰器模式的一种特殊情况。

从另外的角度可以类比一下:
*修饰器模式 -> 类的继承
*代理模式和 -> 抽象接口的实现

至于什么场景适用什么模式,我觉得要灵活一些看待,

这些设计模式的说法,本身就是一个抽象总结的过程,

但实际的项目外围动态的因素太多

想说哪个场景绝对适用哪种模式,有时候反而有些武断了。

不要囿于模式。甚至在一个场景里掺杂两个甚至多个模式也是常见的。

晚风撩人 2017-06-23 01:01:54

先看一下下面的这两个UML类图,他们分别描述了装饰器模式和代理模式的基本实现:

这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文