2012-08-29 66 views
2

我对访问者模式有疑问!想象一下,我有数据结构类,内部它有一个与Class2的关系。 Class2具有约10个类的特定类层次结构。Java的访问者模式

我需要查看Class1实例的列表并根据Class2的类型为Visitor.visit(Class1)调度请求。我不能在class2中使用迭代,因为我需要class1上下文中的变量。

现在,我想讲讲调度员谁接受Class1的对象,那么这个类是检查类class2类型和调用的东西的基础上

visitor.visitClass2Type1(Class1的对象)

但在这种情况下,我放弃了访客模式的相同签名...

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

回答

4

您可以在您的Visitor类中添加一个setContext()方法,告诉Visitor在哪个上下文中需要解释以下对象。

当你有一个对象关系被多个层次嵌套时,你可以添加一个模拟的leaveContext()方法并在你的访问者类中保存一堆上下文。

2

我认为你的Visitor.visit方法应该像Visitor.visit(Class2,Class1)那里你的访问者类将实现每种类型的Class2的访问方法。

这样你就可以实现访问(Class2-1,1类),访(Class2-2,1类)...访问(Class2-10,1类)

我想,这样你就能够访问对象的Class1访问方法内部和访问方法调用将被动态决定,所以它不会不管你的Class2名单有什么信息...

欲了解更多信息,你可以参考wiki页面: http://en.wikipedia.org/wiki/Visitor_pattern

+0

让我知道我是否以错误的方式解释你的问题;) – Atul

2

以菲利普建议的更远一步,试试这个。

鉴于类Widget是父,和阶级特征是子层次

使用简单的基本类型:

// 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; 
    } 

} 

您可以可视化的树模型用例以及其中beginAccept你推到栈上,各种accept方法偷看栈获得他们的父上下文,以及从栈中弹出。这可以允许您递归处理树,同时始终访问父链。