Modello visitatore + Principio aperto / chiuso
-
05-07-2019 - |
Domanda
È possibile implementare Pattern visitatori rispettando Principio aperto / chiuso , ma puoi ancora aggiungere nuove classi visitabili?
Il principio aperto / chiuso afferma che le entità software (classi, moduli, funzioni, ecc.) dovrebbero essere aperte per l'estensione, ma chiuse per 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 modifica.
L'albero della classe AbstractVisitor rispetta il principio aperto / chiuso. L'albero di classe AbstractVisitable non rispetta il principio aperto / chiuso, in quanto non può essere esteso.
Esiste 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);
}
};
Soluzione
In C ++, Visitatore aciclico (pdf) ottiene tu quello che vuoi.
Altri suggerimenti
Potresti voler dare un'occhiata alla ricerca su " il problema dell'espressione " ;, vedi ad esempio
http://lambda-the-ultimate.org/node/2232
Penso che il problema sia principalmente accademico, ma è qualcosa che è stato studiato molto, quindi ci sono un po 'di cose che puoi leggere su diversi modi per implementarlo in lingue esistenti o con varie estensioni di lingua.