首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰设计模式与游客设计模式的区别

装饰设计模式与游客设计模式的区别
EN

Stack Overflow用户
提问于 2012-02-20 15:25:14
回答 8查看 13.3K关注 0票数 30

我相信我理解装饰和游客设计模式的意图。

虽然我可以列出以下不同之处

  1. 装饰师工作在物体上,访客工作在复合结构上,
  2. 设计师是结构设计模式,游客是行为设计模式。

当我在内心深处思考时,我无法说服自己这两者之间的真正区别是什么。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-02-20 15:32:28

嗯,他们实际上是不同的,他们可以!

当您想要使用一些新的、或多或少透明的功能(例如验证或缓存)来增强现有对象时,您可以使用Decorator。参见这里的示例:我应该扩展ArrayList以添加非空属性吗?

另一方面,当您有一个类的层次结构,并且希望根据具体类型运行不同的方法,但避免使用instanceoftypeof操作符时,就会使用访问者。参见实际示例:这种"instanceof“操作符的使用是否被认为是糟糕的设计?

装饰师工作在物体上,访客工作在复合结构上,

访问者工作在继承层次结构上,复合是一种不同的GoF设计模式。

设计师是结构设计模式,游客是行为设计模式。

是的,但这真的无助于理解它们是如何工作的?

另请参阅

票数 34
EN

Stack Overflow用户

发布于 2012-02-20 15:35:46

设计模式并不是按照实现的差异来分类的,而是根据您应该何时使用其中一种或另一种来分类的。

它们的用途完全不同:

  • 当您希望通过提供装饰其他对象的单个元素来动态地丰富对象的功能时,您将使用装饰器,这样它们实际上就会向对象添加一些行为(实际上,它是一种结构模式,因为它改变了您正在使用的对象的结构)。
  • 当您想要将算法与所使用的对象分离时,您将使用访问者。您要做的是让这个访问者传递给多个不同的对象,通常是一个层次结构(据说他们接受访问者),这个访问者根据它在特定时刻访问的对象类型执行特定的操作。通过这种方式,您可以让访问者对特定的对象做它想做的任何事情,而不需要在对象本身中指定这些操作(这就是为什么它是行为)。它是一种有抽象方法的类型,而对象本身没有定义这些方法。
票数 14
EN

Stack Overflow用户

发布于 2016-09-16 11:59:10

它们都“添加功能”到现有对象,而不修改原始类。区别是:

带装饰符--您添加了包装该对象所具有的基本功能的功能(例如,除了执行一些基本操作之外,还可以将其写入日志,此外,将文件写入磁盘也可以对其进行加密)。这还允许我们创建不同的装饰组合,而不必对每个可能的场景进行子类划分。

With 您添加了一种全新的行为,您不希望将其定义为基本组件类本身的一部分(甚至不是作为基本功能的包装器),例如,由于单一责任原则、打开关闭原则等。当相同类型的不同子类之间的行为不同时(如果没有任何复杂的子类结构,只需要一个类,您就可以创建一个新类并通过组合包含原始类,并且仍然可以实现不影响或修改原始类的目标),这种行为尤其有用。这样,就可以避免像if (a is ConcreteClass1) {...} else if (a is ConcreterClass2) {...}这样的代码,而无需编写虚拟方法。

由于这种差异,使用装饰器,客户端代码调用在基本组件类的接口上定义的相同方法,它现在只是“修饰”了额外的功能,而对于访问者,客户端调用了一些通用的“接受”方法,并向它发送了一个访问者。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9363582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档