应用访问者模式来检测图中的循环

时间:2013-03-24 12:20:59

标签: java design-patterns visitor

我需要检测是否在有向图中有一个周期,类似于拓扑排序,但我想使用访问者模式..你有一些想法吗?我可以使用节点的arraylist,边缘或其他结构(不是数组)。

1 个答案:

答案 0 :(得分:2)

访客模式真的无法以最纯粹的形式实现这样的事情。

请记住,访客模式通常有“访问者”在对象网上旅行,但是对象网络“引导”访问者。由于访问者实际上没有路径,因此可以防止某些类型的破坏。

from the wikipedia example of the Visitor pattern (in Java)

class Car implements CarElement {
    CarElement[] elements;

    public Car() {
        //create new Array of elements
        this.elements = new CarElement[] { new Wheel("front left"), 
            new Wheel("front right"), new Wheel("back left") , 
            new Wheel("back right"), new Body(), new Engine() };
    }

    public void accept(CarElementVisitor visitor) {     
        for(CarElement elem : elements) {
            elem.accept(visitor);
        }
        visitor.visit(this);    
    }
}

注意Car接受方法。它确保覆盖汽车的所有子元素,封装导航,同时暴露了对整个数据结构应用外部函数的能力。

由于您的代码需要知道数据结构如何连接在一起,因此访问者模式不适合该任务。如果访问者遇到循环数据结构,未来访问者将陷入同一循环,而不是访问某些数据,从而违反Visitor和{{1}之间的合同}。

现在,如果您未遵循访问路径中的“可能循环”链接,您可能会在某种程度上实现目标。您仍然必须确保访问路径中的所有节点都遵循访问路径的其他分支。那么你的访问者基本上会成为一个很大的节点集合,可以被非旅行的后退链接击中,但是当你实现这样一个奇怪的解决方案时,你会想知道为什么你对访问者部分感到困扰。