当前位置: 首页 > 知识库问答 >
问题:

Java的访客模式

谭灿
2023-03-14

我有一个关于访客模式的问题!假设我有一个数据结构类,在它里面我有一个与类2的has-a关系。Class2有特定的类层次结构,大约有10个类。

我需要创建Class1实例列表,并发送访客请求。根据类别2参观(类别1)。我不能在class2中使用迭代,因为我需要class1上下文中的变量。

现在我在考虑接受Class1对象的dispatcher,然后在这个类的基础上检查class2的类型并调用一些东西

访客。visitClass2Type1(Class1对象)

但在这种情况下,我失去了访客模式的相同签名。。。

另一个问题是如何在访问者模式的上下文中注入变量。比如,如果我遍历树结构,我想保留前一级别的父变量,以便在较低级别上执行某些操作。

共有3个答案

孔深
2023-03-14

按照菲利普的建议再进一步,试试这个。

给定的类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。这可以让您递归地处理树,同时始终可以访问父链。

钮善
2023-03-14

我认为您的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

蒋胡非
2023-03-14

您可以向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模式的工作原理,尽管他们