对于所有这个对象,我想创建一个不同类型的文档:xml,txt,html等。(例如:我想扫描所有对象(形状)树并生成xml文件。
我认为是访客模式的自然方法,我尝试了它的工作原理:-)
- 所有对象都有一个访问方法接受IVisitor接口。
- 我有一个具体的访问者,我想创建各种类型:(XmlVisitor
,TxtVisitor
等)。每个访问者都有一种方法“访问”每种对象。
我的怀疑是......如果我有很多对象,它看起来似乎并不好... 从逻辑的角度看,没关系,我只需要在具体的Visitor中添加新的形状和方法,就是这样。
你怎么看?是否可能是一种可能的?答案 0 :(得分:1)
在我看来,最让您担心的是您正在与许多不同类型的对象进行匹配,并担心随着越来越多的对象类型被添加,性能将受到影响。我认为您不必担心这一点:访问者模式的性能并未真正受到潜在的对象或访问者数量的影响,因为它基于虚拟表查找 - 传递的对象将包含指向(链接)应该调用的方法。
因此,访问者模式虽然在间接访问中相对昂贵,但在这方面可以扩展。
答案 1 :(得分:1)
我认为您已正确实现了访问者模式,因此您还实现了双重调度机制。如果你认为“不能很好地缩放”是需要在添加新形状和/或访问者时添加一堆方法,那么它只是模式的副作用。有些人认为这种“方法爆炸”是有害的,并选择不同的实现,例如具有“决策矩阵”对象。特别是对于这个例子,我认为DD方法是可行的,实际上它可以很好地扩展,因为你在添加新需求时添加新方法(即添加新的visit *方法,因为添加了新的形状或者你添加了需要新文档类型的新访问者类。)
HTH
答案 2 :(得分:0)
我相信你有:
Shape
)和exportXML
,exportToHTML
等)你必须考虑更有可能改变的事情 -
如果类层次结构或多或少已修复但您希望将来添加更多操作,则应选择访问者模式。访问者模式将允许您添加更多操作(例如JSON导出),而无需触及现有的类层次结构。
OTOH如果操作或多或少是固定的,但可以添加更多的Shape对象,那么你应该使用常规继承。定义ShapeExport
接口,其中包含exportToXML
,exportToHTML
等方法。让所有Shapes实现该接口。现在,您可以添加实现相同界面的新Shape,而无需触及现有代码。