如何避免访问者模式实现的空(noop)方法?

时间:2017-12-06 10:19:27

标签: design-patterns

我有大量不同的对象,它们扩展了相同的基类A. 为了将不同的算法应用于集合,我创建了一个IVisitor接口,它为A的每个子节点都有一个Accept方法。

一些实施IVisitor的访问者实际上使用了A的所有孩子,但他们中的许多人都没有,所以我最终会让访问者有一堆我想避免的空(noop)方法。 此外,每次我添加A的新子类时,我需要向IVisitor添加一个新的Accept方法,并且 all 这些类实现它,这是访问者模式的常见问题。

我已尝试实施Selective Visitor pattern,但我不想在周围投放物品,因为这可能是个问题。

我还评估了this question,但其答案并非真正针对问题。我想使用接口而不是抽象类,因为在我的情况下不允许多重继承。

有没有办法避免这种麻烦并获得更清晰的代码?

编辑:您可以在此处找到Draw.io

上的示例

1 个答案:

答案 0 :(得分:1)

您可以为您的案例定义新模式;):“选择性通用访客”。 您的IVisit接口中只能有一个Visit方法接受带有从BaseClass继承的约束的泛型参数。

interface IVisitor<T> where T:BaseClass
{
    void Visit(T element);
}

然后,具体访问者可以指定泛型参数并实现Visit方法。如果您可以利用Autofac之类的IoC容器,它可以作为泛型类型的工厂,您可以通过请求IVisitor并将其传递给Accept方法调用来轻松获取正确的Visitor实例。