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!
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
schreibenMediator
-Schnittstelle (und Ihre ConcreteMediator
-Klasse implementiert diese Schnittstelle) Mediator
-Klasse mit virtuellen Methoden (und Ihre ConcreteMediator
-Klasse wird von Mediator
abgeleitet und überschreibt diese Methoden). 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.
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.