Frage

Ist es möglich, die Visitor Pattern Wahrung der Öffnen / geschlossen-Prinzip , aber noch in der Lage sein, neue besuchbar Klassen hinzufügen?

Die Open / Geschlossen-Prinzip besagt, dass „Software-Entitäten (Klassen, Module, Funktionen, usw.) für die Erweiterung offen sein sollten, aber für die Änderung geschlossen“.

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

Sie können eine beliebige Anzahl von Klassen implementieren, die von AbstractVisitor ableitet: Es ist für Erweiterung offen ist. Sie können keine neue besuchbar Klasse hinzufügen, die von AbstractVisitor abgeleiteten Klassen werden nicht kompilieren. Es ist für Veränderung geschlossen

Der AbstractVisitor Klassenbaum respektiert die Open / Geschlossen-Prinzip. Der AbstractVisitable Klassenbaum nicht das Öffnen / Geschlossen-Prinzip respektieren, da sie nicht verlängert werden können.

Gibt es eine andere Lösung als den AbstractVisitor und AbstractVisitable wie unten zu verlängern?

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);
   }
};
War es hilfreich?

Lösung

In C ++, Azyklisches Besucher (pdf) bekommt Sie, was Sie wollen.

Andere Tipps

Sie mögen vielleicht Forschung prüfen, auf „dem Ausdruck Problem“, siehe z.

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

Ich denke, das Problem meist akademisch ist, aber es ist etwas, das viel untersucht wurde, so dass es ein bisschen Sachen kann man über verschiedene Möglichkeiten, lesen Sie es verschiedene Spracherweiterungen in bestehenden Sprachen oder mit implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top