2008-10-05 11 views
15

È possibile implementare lo Visitor Pattern rispettando lo Open/Closed Principle, ma è ancora possibile aggiungere nuove classi visitabili?Modello visitatore + Principio aperto/chiuso

Il principio aperto/chiuso indica che "le entità software (classi, moduli, funzioni, ecc.) Devono essere aperte per l'estensione, ma chiuse per la modifica".

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

È possibile implementare qualsiasi numero di classi che deriva da AbstractVisitor: è aperto per l'estensione. Non è possibile aggiungere una nuova classe visitabile poiché le classi derivate da AbstractVisitor non verranno compilate: è stata chiusa per la modifica.

L'albero della classe AbstractVisitor rispetta il principio Aperto/Chiuso. L'albero della classe AbstractVisual non rispetta il Principio Aperto/Chiuso, in quanto non può essere esteso.

C'è qualche altra soluzione che estendere AbstractVisitor e AbstractVisitable come di seguito?

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

risposta

3

Si potrebbe voler controllare la ricerca su "il problema di espressione", vedere ad es.

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

Credo che il problema è in gran parte accademica, ma è qualcosa che è stato studiato molto, quindi c'è un po 'di roba si può leggere modi su diversi per implementare in lingue esistenti o con le varie estensioni del linguaggio .