c++ - principios - Patrón de visitante+Principio abierto/cerrado
principio abierto cerrado java (2)
¿Es posible implementar el patrón de visitante respetando el principio abierto / cerrado , pero aún así ser capaz de agregar nuevas clases visitables?
El principio 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 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 clase AbstractVisitor respeta el principio 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 el AbstractVisitable como se muestra a continuación?
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);
}
};
En C ++, Acyclic Visitor (pdf) obtiene lo que desea.
Es posible que desee consultar la investigación sobre "el problema de expresión", ver, por ejemplo
http://lambda-the-ultimate.org/node/2232
Creo que el problema es principalmente académico, pero es algo que se ha estudiado mucho, por lo que hay algunas cosas que puedes leer sobre las diferentes formas de implementarlo en los idiomas existentes o con varias extensiones de idioma.