8

Mediator パターンに精通している方は...

Delphi で Mediator パターンを実装したいのですが、Delphi コンパイラは必要な循環参照を処理できません。

「デザイン パターン」の元の GOF ダイアグラムを見ると、Mediator は各 Colleague への参照を持っていますが、Colleague オブジェクトの多くは Mediator への参照を持っています。

これはほとんどの言語では問題になりませんが、Delphi コンパイラから「F2047 Circular unit reference to ...」というメッセージが表示されます。

インターフェイスを使用したこのアプローチは役に立ちますか? (複雑そうです)

Delphi 2010 を使用しています

ソリューションの概要

受け入れられた回答を要約すると、循環参照を許可する言語では、抽象的な Mediator クラスを省略できます (278 ページの GoF の「実装」セクションで説明されているように)。抽象 Mediator クラスを使用せずに Delphi で Mediator を実装できる唯一の方法は、すべてのクラスを 1 つの Unit に含めることです。

それ以外の場合は、具体的なサブクラスに加えて、追加の抽象 Mediator 基本クラスが必要です。

3 つのユニットの Uses 句は次のようになります。

ConcreteColleage1は Mediator
を使用 ConcreteMediator は Mediator を使用、ConcreateColleague1
は Mediator (どちらも使用しない)

循環参照禁止!

4

3 に答える 3

7

インターフェイスを使用すると、ユニット間の依存関係を減らすことができます。もう 1 つのアプローチは、クラス間の相互作用メソッドを定義する抽象基本クラスを用意し、具体的な子孫を別のユニットに配置することです。

参照:循環単位参照を回避するには? Delphi で循環参照を回避する方法の詳細については、

于 2011-01-25T07:22:34.627 に答える
5

循環依存関係が発生する場所がわかりません。この図に従ってクラスを実装すると、そのようなことは起こらないはずです。

このダイアグラムを Delphi で実装するには、実際に次のように記述する必要があります。

  • インターフェイスのいずれかMediator(およびConcreteMediatorクラスにこのインターフェイスを実装させます)
  • Mediatorまたは仮想メソッドを持つ基本クラス (およびクラスをこれらのメソッドConcreteMediatorから派生さMediatorせてオーバーライドする)。
于 2011-01-25T08:40:44.513 に答える
2

考慮すべきもう 1 つのオプションは、メディエーターと同僚を同じユニットに配置することです。多くの場合、これは循環参照を回避する Delphi の慣用的な方法です。

を使用するinterfacesことは、多くの場合、この種の問題に対する優れたアプローチですが、場合によっては、実際の利益が得られないほど複雑になることがあります。

コードのトレードオフがどこに当てはまるかを知るのは難しいため、一般的なルールとして、一方のアプローチが他方よりも優れているとは言いたくありません。

于 2011-01-25T07:39:06.930 に答える