是否可以实施尊重Visitor Pattern的Open/Closed Principle,但仍然可以添加新的可访问类?
开放/封闭原则规定“软件实体(类,模块,功能等)应该是可以扩展的,但是关闭以进行修改”。
struct ConcreteVisitable1;
struct ConcreteVisitable2;
struct AbstractVisitor
{
virtual void visit(ConcreteVisitable1& concrete1) = 0;
virtual void visit(ConcreteVisitable2& concrete2) = 0;
};
struct AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor) = 0;
};
struct ConcreteVisitable1 : AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor)
{
visitor.visit(*this);
}
};
struct ConcreteVisitable2 : AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor)
{
visitor.visit(*this);
}
};
您可以实现从AbstractVisitor派生的任意数量的类:它可以用于扩展。您无法添加新的可访问类,因为从AbstractVisitor派生的类将无法编译:它已关闭以进行修改。
AbstractVisitor类树遵循开放/封闭原则。 AbstractVisitable类树不遵守开放/封闭原则,因为它无法扩展。
除了扩展AbstractVisitor和AbstractVisitable之外还有其他解决方案吗?
struct ConcreteVisitable3;
struct AbstractVisitor2 : AbstractVisitor
{
virtual void visit(ConcreteVisitable3& concrete3) = 0;
};
struct AbstractVisitable2 : AbstractVisitable
{
virtual void accept(AbstractVisitor2& visitor) = 0;
};
struct ConcreteVisitable3 : AbstractVisitable2
{
virtual void accept(AbstractVisitor2& visitor)
{
visitor.visit(*this);
}
};
答案 0 :(得分:8)
在C ++中,Acyclic Visitor(pdf)可以为您提供所需的内容。
答案 1 :(得分:4)
您可能想查看有关“表达问题”的研究,请参阅例如
http://lambda-the-ultimate.org/node/2232
我认为这个问题主要是学术性的,但它已经被研究了很多,所以你可以阅读一些关于在现有语言或各种语言扩展中实现它的不同方法的东西。