我相信我理解装饰和游客设计模式的意图。
虽然我可以列出以下不同之处
当我在内心深处思考时,我无法说服自己这两者之间的真正区别是什么。
发布于 2012-02-20 15:32:28
嗯,他们实际上是不同的,他们可以!
当您想要使用一些新的、或多或少透明的功能(例如验证或缓存)来增强现有对象时,您可以使用Decorator。参见这里的示例:我应该扩展ArrayList以添加非空属性吗?
另一方面,当您有一个类的层次结构,并且希望根据具体类型运行不同的方法,但避免使用instanceof或typeof操作符时,就会使用访问者。参见实际示例:这种"instanceof“操作符的使用是否被认为是糟糕的设计?
装饰师工作在物体上,访客工作在复合结构上,
访问者工作在继承层次结构上,复合是一种不同的GoF设计模式。
设计师是结构设计模式,游客是行为设计模式。
是的,但这真的无助于理解它们是如何工作的?
另请参阅
发布于 2012-02-20 15:35:46
设计模式并不是按照实现的差异来分类的,而是根据您应该何时使用其中一种或另一种来分类的。
它们的用途完全不同:
发布于 2016-09-16 11:59:10
它们都“添加功能”到现有对象,而不修改原始类。区别是:
带装饰符--您添加了包装该对象所具有的基本功能的功能(例如,除了执行一些基本操作之外,还可以将其写入日志,此外,将文件写入磁盘也可以对其进行加密)。这还允许我们创建不同的装饰组合,而不必对每个可能的场景进行子类划分。
With 您添加了一种全新的行为,您不希望将其定义为基本组件类本身的一部分(甚至不是作为基本功能的包装器),例如,由于单一责任原则、打开关闭原则等。当相同类型的不同子类之间的行为不同时(如果没有任何复杂的子类结构,只需要一个类,您就可以创建一个新类并通过组合包含原始类,并且仍然可以实现不影响或修改原始类的目标),这种行为尤其有用。这样,就可以避免像if (a is ConcreteClass1) {...} else if (a is ConcreterClass2) {...}这样的代码,而无需编写虚拟方法。
由于这种差异,使用装饰器,客户端代码调用在基本组件类的接口上定义的相同方法,它现在只是“修饰”了额外的功能,而对于访问者,客户端调用了一些通用的“接受”方法,并向它发送了一个访问者。
https://stackoverflow.com/questions/9363582
复制相似问题