¿Es posible implementar el Visitor Pattern respetando el Open/Closed Principle, pero aún así puede agregar nuevas clases visitables?Patrón visitante + Abierto/Cerrado Principio
El Principio de abierto/cerrado establece que "las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas para la extensión, pero cerradas para su modificación".
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);
}
};
Puede implementar cualquier cantidad de clases que se deriven de AbstractVisitor: Está abierto para la extensión. No puede agregar una nueva clase visitable ya que las clases derivadas de AbstractVisitor no se compilarán: se cerró para su modificación.
El árbol de clases AbstractVisitor respeta el principio de abierto/cerrado. El árbol de clases AbstractVisitable no respeta el principio abierto/cerrado, ya que no se puede extender.
¿Hay alguna otra solución que extender el AbstractVisitor y AbstractVisitable de la siguiente manera?
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);
}
};