因此,我已经阅读了有关访问者模式的所有文档,但我仍然非常困惑。我从另一个问题中获取了这个例子,有人可以帮助我理解吗?例如,我们什么时候使用访问者设计模式?我想我可能已经理解了一些,但我只是看不到更大的图景。我怎么知道什么时候可以使用它?
class equipmentVisited
{
virtual void accept(equipmentVisitor* visitor) = 0;
}
class floppyDisk : public equipmentVisited
{
virtual void accept(equipmentVisitor* visitor);
}
class processor : public equipmentVisited
{
virtual void accept(equipmentVisitor* visitor);
}
class computer : public equipmentVisited
{
virtual void accept(equipmentVisitor* visitor);
}
class equipmentVisitor
{
virtual void visitFloppyDisk(floppyDisk* );
virtual void visitProcessor(processor* );
virtual void visitComputer(computer* );
}
// Some additional classes inheriting from equipmentVisitor would be here
equipmentVisited* visited;
equipmentVisitor* visitor;
// Here you initialise visited and visitor in any convenient way
visited->accept(visitor);
访问者模式用于实现双重调度 http://en.wikipedia.org/wiki/Double_dispatch。简而言之,这意味着执行的代码取决于两个对象的运行时类型。
当你打电话给常客时虚函数,它是一个单一的调度:执行的代码片段取决于单个对象的运行时类型,即您正在调用的虚拟方法。
对于访问者模式,被调用的方法最终取决于两个对象的类型 - 实现该方法的对象的类型equipmentVisitor
,以及您调用的对象的类型accept
(即equipmentVisited
子类)。
在 C++ 中还有其他方法来实现双重调度。 Scott Meyer 的第 31 项“更有效的 C++” https://rads.stackoverflow.com/amzn/click/com/020163371X深入探讨这个主题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)