访客模式可以采用其他参数

时间:2014-05-06 09:59:10

标签: c# design-patterns domain-driven-design visitor-pattern

在实现访问者模式时,向Accept和Visit方法添加其他参数是一个坏主意吗?我从未见过任何这样做的例子,但也没有提到它是一个坏主意。

我想在我的域模型中使用此模式,但是需要其他参数以及实体本身。

例如 -

public interface ISomethingVisitor
{
    void Visit(Foo foo, int p1, int p2);
}

public interface ISomethingVisitable
{
    void Accept(ISomethingVisitor visitor, int p1, int p2);
}

2 个答案:

答案 0 :(得分:3)

我说这是个坏主意。它可能对这个访问者很好,但是当另一个访问者需要更多/不同的参数时会发生什么?如果p1p2没有变化,您可以在施工时将其提供给访问者:

public class MyVisitor : ISomethingVisitor
{
    private int p1;
    private int p2;

    public MyVisitor(int p1, int p2)
    {
       _p1 = p1;
       _p2 = p2;
    }

    public void Visit(Foo foo)
    {
        //got access to _p1, _p2 here 
    }
}

答案 1 :(得分:0)

我正在做类似的事情,但是使用Java。我要向访问传递一些“访问上下文”信息时遇到了同样的问题,但是我的问题是“访问者”是无状态的,因此仅创建了一个访问者来为所有线程提供服务(即:所有信息)将必须通过参数)。我不想涉足线程本地变量的业务。

因此,对于界面的设计,我建议以下内容:

public interface ISomethingVisitor
{
    void Visit(Foo foo, VisitOptions params);
}

public interface ISomethingVisitable
{
    void Accept(ISomethingVisitor visitor, VisitOptions params);
}

通过这种方式,您可以使用2个字段来定义VisitOptions参数:p1p2,如果以后要添加一些参数,将它们添加到VisitOptions类中也没问题。 。任何现有代码只会忽略它们的存在。如果通过更改/删除参数来修改VisitOptions,则会遇到问题,但这是典型的向后兼容性问题。