“访客”有很多不同类型的对象

时间:2012-11-06 15:22:30

标签: oop design-patterns

在一个应用程序中我有很多不同的对象,我们说:方形,圆形等......很多不同的形状--->对于这个简单的例子我很抱歉。

对于所有这个对象,我想创建一个不同类型的文档:xml,txt,html等。(例如:我想扫描所有对象(形状)树并生成xml文件。

我认为是访客模式的自然方法,我尝试了它的工作原理:-) - 所有对象都有一个访问方法接受IVisitor接口。 - 我有一个具体的访问者,我想创建各种类型:(XmlVisitorTxtVisitor等)。每个访问者都有一种方法“访问”每种对象。

我的怀疑是......如果我有很多对象,它看起来似乎并不好... 从逻辑的角度看,没关系,我只需要在具体的Visitor中添加新的形状和方法,就是这样。

你怎么看?是否可能是一种可能的?

3 个答案:

答案 0 :(得分:1)

在我看来,最让您担心的是您正在与许多不同类型的对象进行匹配,并担心随着越来越多的对象类型被添加,性能将受到影响。我认为您不必担心这一点:访问者模式的性能并未真正受到潜在的对象或访问者数量的影响,因为它基于虚拟表查找 - 传递的对象将包含指向(链接)应该调用的方法。

因此,访问者模式虽然在间接访问中相对昂贵,但在这方面可以扩展。

答案 1 :(得分:1)

我认为您已正确实现了访问者模式,因此您还实现了双重调度机制。如果你认为“不能很好地缩放”是需要在添加新形状和/或访问者时添加一堆方法,那么它只是模式的副作用。有些人认为这种“方法爆炸”是有害的,并选择不同的实现,例如具有“决策矩阵”对象。特别是对于这个例子,我认为DD方法是可行的,实际上它可以很好地扩展,因为你在添加新需求时添加新方法(即添加新的visit *方法,因为添加了新的形状或者你添加了需要新文档类型的新访问者类。)

HTH

答案 2 :(得分:0)

我相信你有:

  1. 类层次结构(示例中为Shape)和
  2. 类层次结构的操作(示例中为exportXMLexportToHTML等)
  3. 你必须考虑更有可能改变的事情 -

    1. 如果类层次结构或多或少已修复但您希望将来添加更多操作,则应选择访问者模式。访问者模式将允许您添加更多操作(例如JSON导出),而无需触及现有的类层次结构。

    2. OTOH如果操作或多或少是固定的,但可以添加更多的Shape对象,那么你应该使用常规继承。定义ShapeExport接口,其中包含exportToXMLexportToHTML等方法。让所有Shapes实现该接口。现在,您可以添加实现相同界面的新Shape,而无需触及现有代码。