是否可以實現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類樹不尊重Open/Closed原則,因爲它不能被擴展。
除了擴展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);
}
};