访问者模式可以接受其他参数吗?

本文关键字:其他 参数 模式 访问者 | 更新日期: 2023-09-27 18:01:59

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

我想在我的领域模型中使用这种模式,但是需要额外的参数以及实体本身。

eg -

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

访问者模式可以接受其他参数吗?

我觉得这是个坏主意。它可能对这个访问者工作得很好,但是当另一个访问者需要更多/不同的参数时会发生什么?如果p1, p2不变,您可以在施工时将它们交给访客:

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

我正在做类似的事情,但是使用Java。我面临着同样的问题,我想传递一些"访问上下文"信息到访问,但我的问题是,"访问者"是无状态的,所以只有一个访问者被创建在前面服务所有线程(即:所有信息都必须通过参数)。我不想讨论线程局部变量的问题。

所以,对于你的界面设计,我的建议如下:

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

这样,你可以定义你的VisitOptions参数与2个字段:p1p2,如果你想添加一些参数以后,没有问题通过添加到你的VisitOptions类…任何现有的代码都会忽略它们的存在。如果通过更改/删除参数来修改VisitOptions,则会遇到问题,但这是典型的向后兼容性问题。