2008-10-05 27 views
15

¿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); 
    } 
}; 

Respuesta

3

Es posible que desee consultar la investigación sobre "el problema de la expresión", consulte p. Ej.

http://lambda-the-ultimate.org/node/2232

Creo que el problema es sobre todo académica, pero es algo que se ha estudiado mucho, así que hay un poco de cosas se puede leer acerca de las diferentes maneras de implementar en los lenguajes existentes o con varias extensiones del lenguaje .

Cuestiones relacionadas