我有一个关于访客模式的问题!假设我有一个数据结构类,在它里面我有一个与类2的has-a关系。Class2有特定的类层次结构,大约有10个类。
我需要创建Class1实例列表,并发送访客请求。根据类别2参观(类别1)。我不能在class2中使用迭代,因为我需要class1上下文中的变量。
现在我在考虑接受Class1对象的dispatcher,然后在这个类的基础上检查class2的类型并调用一些东西
访客。visitClass2Type1(Class1对象)
但在这种情况下,我失去了访客模式的相同签名。。。
另一个问题是如何在访问者模式的上下文中注入变量。比如,如果我遍历树结构,我想保留前一级别的父变量,以便在较低级别上执行某些操作。
按照菲利普的建议再进一步,试试这个。
给定的类Widget是父类,而类Feature是子层次结构的基本类型
简单用法:
// widget will have an instance of a Feature subclass from args or config, etc
Widget theWidget = new Widget(args);
// create and configure visitor
Visitor theVisitor = new Visitor();
theVisitor.prop1 = x;
theVisitor.prop2 = y;
theVisitor.prop3 = z;
theWidget.visit(theVisitor);
Widget(父类):
class Widget
{
Feature _childFeature;
void visit(Visitor visitor)
{
visitor.beginAccept(this);
childFeature.visit(visitor);
visitor.endAccept();
}
}
要素类层次结构:
abstract class Feature
{
abstract void visit(Visitor visitor);
}
class Sunroof extends Feature
{
void visit(Visitor visitor)
{
visitor.accept(this);
}
}
class BulletProof extends Feature
{
void visit(Visitor visitor)
{
visitor.accept(this);
}
}
class GoldPlated extends Feature
{
void visit(Visitor visitor)
{
visitor.accept(this);
}
}
同时使用父级和子级的具体访问者:
class ExampleVisitor extends Visitor
{
private _widgetInProcess;
void beginAccept(Widget w)
{
_widgetInProcess = w;
}
void accept(Sunroof feature)
{
// do work based on both _widgetInProcess and type-specific feature
}
void accept(BulletProof feature)
{
// do work based on both _widgetInProcess and type-specific feature
}
void accept(GoldPlated feature)
{
// do work based on both _widgetInProcess and type-specific feature
}
void endAccept()
{
_widgetInProcess = null;
}
}
您还可以可视化树模型用例,在beginacept
中,您将其推到堆栈上,各种accept
方法查看堆栈以获取其父上下文,然后从堆栈中弹出endAccept
。这可以让您递归地处理树,同时始终可以访问父链。
我认为您的Visitor.visit方法应该像Visitor.visit(Class2,Class1),其中访问者类将为每种类型的Class2实现访问方法。
所以你可以实现visit(Class2-1,Class1),visit(Class2-2,Class1)。。。参观(2-10班,1班)
我认为,通过这种方式,你将能够在访问方法中访问Class1对象信息,因为访问方法调用将被动态决定,所以不管你的Class2列表中有什么。。。
有关更多信息,请参阅wiki页面:http://en.wikipedia.org/wiki/Visitor_pattern
您可以向Visitor类添加一个setContext()方法,该方法告诉访问者需要在哪个上下文中解释以下对象。
当对象关系嵌套在多个级别上时,可以添加一个类似的leveContext()方法,并在visitor类中保留一堆上下文。
在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者的变化而变化。 此模式属于行为模式类别。 根据模式,元素对象必须接受访问者对象,以便访问者对象处理元素对象上的操作。 实现 (Implementation) 我们将创建一个定义接受操作的ComputerPart接口。 Keyboard , Mouse , Monitor和Computer
问题内容: 我对访问者模式及其用途感到非常困惑。我似乎无法真正想象使用此模式或其目的的好处。如果有人可以举例说明的话,那就太好了。 问题答案: 很久以前… 然后,您意识到您希望能够按其他流派过滤图书馆的藏书。您可以继续添加新的getter方法。或者您可以使用访客。 您将数据与算法分开。您将算法卸载到访问者实现中。您可以通过创建 更多 访问者来添加功能,而不是不断修改(和膨胀)保存数据的类。
所以,是的,我保留了访客模式的主要思想,而不是来回的疯狂。这样可以吗?
问题内容: 我正在调查与访客模式有关的其他问题,但无法理解访客模式中双重调度的实现。 请参考链接 访客模式 访客模式中的双重调度如何工作? 问题答案: 元素对象的方法接收一个访问者对象,并在该访问者对象上调用该方法。由于访问者对象具有多种方法,因此根据元素类型调用适当的方法。在这里,我们有两个调用( double dispatch ),它们指定 元素 和 元素 的正确 操作 (基于其类型)。
cPanel的此界面允许您查看域的静态和分析。 这些简单的指标功能可帮助您了解自己的效果并优化网站质量。 Step 1 - 单击cPanel Home的Metrics部分下的Visitors图标。 您将看到可用域名列表。 Step 2 - 有关特定域的详细信息,只需单击域名后面的“ View 。 这里将获得的表分为五列,即IP(因特网协议),URL,时间,大小,引用URL。 IP (Interne
问题内容: 我的同事建议我写一个访客模式来浏览AST。谁能告诉我更多我将如何开始写它? 据我了解,AST中的每个Node都有方法(?),它将以某种方式被调用(从哪里?)。到此结束我的理解。 为了简化一切,假设我有节点,,,和树是这个样子: 谁能想到访客模式将如何访问此树以产生输出: 谢谢,博达·西多(Boda Cydo)。 问题答案: Wikipedia概述了Visitor模式的工作原理,尽管他们