Pregunta

¿Es posible implementar el Patrón de visitante respetando el Principio abierto / cerrado , pero ¿aún puede 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 la 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 modificación.

El árbol de la 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 AbstractVisitor y 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);
   }
};
¿Fue útil?

Solución

En C ++, Acyclic Visitor (pdf) obtiene usted lo que quiere.

Otros consejos

Es posible que desee consultar la investigación sobre " el problema de expresión " ;, consulte, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top