锁定老帖子 主题:装饰器模式和代理模式的区别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-22
alex295111 写道 虽然结构大致一样,其实两个模式很好分的。
装饰者:为了解决新增某个功能,引起类剧增的问题,客户端一般都是直接用具体了编程 代理模式:主要就是为了代理,主要是面向接口的,客户端一般直接用接口编程 是啊,如果对定义理解的比较彻底,是很好区分的 |
|
返回顶楼 | |
发表时间:2011-06-27
为什么要区分这个??模式之所以有名字应该只是为了交流的吧!在写代码的时候完全可以只记住了他们的uml图就可以了!既然使用这样的方式来写代码!代码写出来了有人来交流,那么在交流的时候说是什么模式,还有多大的争论的必要么!?重要的是你写的代码是符合高扩展低耦合的不就ok了!
|
|
返回顶楼 | |
发表时间:2011-06-27
cczakai 写道 感觉作者专门侧重定于这些表面内容了。
代理模式:比如你就是代理,那你就该执行你代理角色的 职能。我们可以在执行角色职能先后,可以按自己想法去做,比如dobefore,doafter。 装饰模式:不要你去代理,而是你去装饰。让你去保持类的本来职责的同时,动态增加新的变化。 装饰设计与代理设计完全不一样,可能从字面我们可以发现其实可以替换的,但意义完全不一样了。我们不是过程化,要OO思想,所以一些场景包括设计思想要考虑,不要考虑用另外一种模式也可以完成一样看起来差别不大的功能。 无错不是错,这话不正确。 为什么AOP用到代理,因为简单,作者设计意图就是用代理处理的。其它模式能处理,代理更具00思想。 为什么老大找你做代理,而不去自己加强自己技能的提高呢?为什么公司有了总裁,还需要职业经理人呢? (装饰)自己去实现,导致职责过多,势必会影响其它类的职责,削弱或者抑制其它类的完成职责作用,当变化发生,设计遭受意想不到的破坏。 一般职责过多,在系统中频繁使用,很容易导致职责越弄越大,甚至改不动了 透彻 |
|
返回顶楼 | |
发表时间:2011-11-07
最后修改:2011-11-07
装饰者模式和代理模式我觉得还是很好区分的
装饰的关注点是把装饰类的功能“组装”起来 而代理的可以做的东西就杂很多了,反正给到你要的结果就行。可以理解成“组装”也是它的一种职责,但是实现方式可以和装饰者不同。甚至也可以根本就不用组装,例如说缓存代理,它做的就是判断从缓存获取,还是从数据库、文件获取东西而已,不用做什么组装。 ---------------------------- 其实我觉得更难区分的是代理模式和适配器模式。适配器强调的是接口转换,但是我也完全可以理解成接口转换也是代理类的一种职责。 |
|
返回顶楼 | |
发表时间:2011-11-07
最后修改:2011-11-07
luckaway 写道 在典型的例子上,两者是非常好区分的。如spring的AOP、远程代理类、JDK的proxy,都是代理模式。JDK里的输入/输出器是很典型的装饰器模式!
但在有些场景上,对设计模式入门的新手,还是有点难区分,我曾经也一度为此困惑。 两个模式的UML类图基本没区别,都是实现同一个接口,一个类包装另一个类。 两者的定义 装饰器模式:能动态的新增或组合对象的行为。 代理模式:为其他对象提供一种代理以控制对这个对象的访问. 装饰模式是“新增行为”,而代理模式是“控制访问”。关键就是我们如何判断是“新增行为”还是“控制访问”。 来看一个例子 之前设计的搜索引擎检索模块: Searcher:检索类接口 IllegalKeywordFilterSearcher:非法关键词过滤检索类,即如果搜索关键词里包含非法关键词,直接返回空结果集。 CachedSearcher:缓存检索类,相同检索条件缓存已经有数据,返回缓存里的结果集。 DistributedSearcher:分布式检索类,调用多台服务器的检索服务,然后合并最终的结果集。 LocalSearcher:本地检索类,只能从当台服务器上检索结果 HightLightSearcher:高亮检索类,操作结果集,找到跟搜索条件最相关的片段,并且关键词上高亮。 其中HightLightSearcher很明显是装饰类,新增了高亮的行为。 CachedSearcher是代理类,可能也没疑义,因为可能听说过“缓存代理”的说法。 IllegalKeywordFilterSearcher就不好确定是代理类还是装饰类,可以理解是控制访问,也可以理解成是新增行为,毕竟它是业务需求,总觉得业务需求应该属于行为。 看了这篇文章之后difference-between-decorator-and-proxy-patterns就非常明确了。 原句:I think we’re all aware that the decorator pattern is used to add behavior to existing code. This does not stop at one kind of behavior but any number of different things that we want to do. 意译:装饰类只能新增行为,不能跳过其他的任何一个行为。 IllegalKeywordFilterSearcher如果检测到有敏感关键词,就直接返回空结果了,不会再调用其他检索类了,所以不是 装饰类,而是代理类。 当然,有些类可能既有控制访问的逻辑,也有新增行为逻辑。比如高亮和缓存整合在一个类里,但是违反了单一职责原则,觉得也没讨论的必要。 网上已经有很多关于两者区别的文章,但是评判的标准的都不是非常明确,我不知道大家有没有类似的困惑。 首先,我们把proxy,decorator,adapter都称为wrapper模式,它们二者的主要区别有其实有三: 1.proxy主要控制对真实对象的访问等,比如权限控制这方面。proxy所加入的功能和你的目标对象完成的功能不是一类的,而decorator完成的功能和你目标对象完成的功能是一类的,比如,io的buffered相关的decorator,都是为了input和output功能,这个和修饰的对象本质功能没有发生变化,所以是一类的,只不过提供了了缓冲的功能。 2.decorator可以增加一些被修饰目标没有的操作,而proxy的不能新增加(当然不是强迫,适时也可以变化)。 3.目标对象可以被同一个decorator对象重复修饰或者被其他decorator重复修饰,而proxy不做此用。 关于更详细的介绍,请看我的书籍《漫谈设计模式》相关的章节,里面专门有讲。 |
|
返回顶楼 | |