在实现访问者模式时,向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个字段:p1
和p2
,如果你想添加一些参数以后,没有问题通过添加到你的VisitOptions类…任何现有的代码都会忽略它们的存在。如果通过更改/删除参数来修改VisitOptions,则会遇到问题,但这是典型的向后兼容性问题。