设计模式-修饰模式和代理模式的区别
在设计模式中,看修饰模式和代理模式的时候,觉得说的差不多,这两者之前有什么明显区别或者应用场景有什么突出不同么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在设计模式中,看修饰模式和代理模式的时候,觉得说的差不多,这两者之前有什么明显区别或者应用场景有什么突出不同么?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
修饰模式
动态继承,让类具有在运行期改变行为的能力,一个类可能在不同的运行阶段表现出不同的行为,但是又不需要在某一个特定的阶段让他具备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类
简单而言,修饰模式是动态继承,代理模式是类之间的封装和(某个方面的)复用
修饰模式和代理模式的作用是不同的。
核心区别简单的说就是
*修饰模式会对base类定义的接口进行一定的modify
*代理模式则不会,只会实现这个接口
从一定意义可以理解,代理模式是修饰器模式的一种特殊情况。
从另外的角度可以类比一下:
*修饰器模式 -> 类的继承
*代理模式和 -> 抽象接口的实现
至于什么场景适用什么模式,我觉得要灵活一些看待,
这些设计模式的说法,本身就是一个抽象总结的过程,
但实际的项目外围动态的因素太多
想说哪个场景绝对适用哪种模式,有时候反而有些武断了。
不要囿于模式。甚至在一个场景里掺杂两个甚至多个模式也是常见的。
先看一下下面的这两个UML类图,他们分别描述了装饰器模式和代理模式的基本实现:
这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。
然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。