Implementieren des Mediator-Musters in Delphi ohne Zirkelbezüge

8

Für diejenigen, die mit dem Mediator-Muster vertraut sind ...

Ich möchte das Mediator-Muster in Delphi implementieren, aber der Delphi-Compiler kann die erforderlichen Zirkelverweise nicht verarbeiten.

Wenn Sie sich das ursprüngliche GOF-Diagramm von "Design Patterns" ansehen, hat der Mediator einen Verweis auf jeden Kollegen, aber viele der Kollegen-Objekte haben eine Referenz zurück zum Mediator.

Dies ist in den meisten Sprachen kein Problem, aber mein Delphi-Compiler gibt mir 'F2047 Circular unit reference to ...'

Würde diese Vorgehensweise , unter Verwendung von Schnittstellen, irgendwelche Verwendung? (Scheint kompliziert)

Ich benutze Delphi 2010

[ Zusammenfassung der Lösung ]

Um nur die akzeptierte Antwort zusammenzufassen: In Sprachen, die Zirkelbezüge zulassen, können Sie die abstrakte Mediator-Klasse weglassen (wie im Abschnitt "Implementierung" von GoF auf Seite 278 beschrieben). Die einzige Möglichkeit, Mediator in Delphi ohne eine abstrakte Mediator-Klasse zu implementieren, besteht darin, alle Klassen in einer Einheit zu haben .

Andernfalls benötigen Sie zusätzlich zu der konkreten Unterklasse eine zusätzliche abstrakte Mediator-Basisklasse.

Ihre Anwendungsklauseln für die drei Einheiten würden wie folgt aussehen:

ConcreteColleage1 verwendet Mediator
ConcreteMediator benutzt Mediator, ConcreateColleague1
Mediator (Wird auch nicht verwendet)

Keine zirkulären Referenzen!

    
awmross 25.01.2011, 05:45
quelle

3 Antworten

5

Ich sehe nicht, wo die zirkulären Abhängigkeiten entstehen. Wenn Sie Ihre Klassen nach diesem Diagramm implementieren, sollte das nicht passieren.

Um dieses Diagramm in Delphi zu implementieren, müssen Sie tatsächlich

schreiben
  • Entweder eine Mediator -Schnittstelle (und Ihre ConcreteMediator -Klasse implementiert diese Schnittstelle)
  • oder eine Basis Mediator -Klasse mit virtuellen Methoden (und Ihre ConcreteMediator -Klasse wird von Mediator abgeleitet und überschreibt diese Methoden).
LeGEC 25.01.2011, 08:40
quelle
7

Die Verwendung von Schnittstellen kann sicherlich dazu beitragen, die Abhängigkeiten zwischen Einheiten zu verringern. Ein anderer Ansatz besteht darin, abstrakte Basisklassen zu haben, die die Interaktionsmethoden zwischen den Klassen definieren und dann konkrete Nachkommen in separate Einheiten setzen.

Siehe: Wie vermeidet man eine zirkuläre Einheitsreferenz? für weitere Informationen zu wie man zirkulare Referenzen in Delphi vermeidet.

    
Marjan Venema 25.01.2011 07:22
quelle
2

Eine weitere Option ist, Mediator und Kollege in derselben Einheit zu platzieren. In vielen Situationen ist das der idiomatische Delphi-Weg, um zirkuläre Referenzen zu vermeiden.

Die Verwendung von interfaces ist oft ein guter Ansatz für diese Art von Problem, aber manchmal kann es zu zusätzlicher Komplexität für keinen echten Gewinn führen.

Es ist schwer zu wissen, wo die Kompromisse für Ihren Code fallen würden, daher möchte ich nicht sagen, dass eine Vorgehensweise besser ist als die andere als allgemeine Regel.

    
David Heffernan 25.01.2011 07:39
quelle

Tags und Links