2011-01-25 6 views
8
Mediatorパターンに精通しているものについては

を得ることなく、DelphiでMediatorパターンの実装が、Delphiコンパイラは、循環参照を扱うことができません必須。は <p></p>が、私はDelphiでMediatorパターンを実装したい...循環参照

「デザインパターン」の元のGOF図を見ると、メディエータには各同僚の参照がありますが、同僚のオブジェクトの多くにはメディエータへの参照があります。

これは、ほとんどの言語では問題ではありませんが、私のDelphiコンパイラは、任意の使用可能、インターフェースを使用して、私に

this approach「へ... F2047循環ユニットの参照」を与えていますか?循環参照を許可する言語では、あなたが抽象メディエータクラスを省略することができます。

私は、Delphi 2010

[ソリューションの概要]

だけ受け入れ答えを要約するを使用しています(複雑なようです)(GoFの「実装」セクション(278ページ)を参照)。 抽象MediatorクラスなしでMediatorをDelphiで実装できる唯一の方法は、すべてのクラスを1つのユニットにまとめることです。

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

あなたのuses句は次のようになります。

ConcreteColleage1はメディエータ
ConcreteMediatorはメディエータ、ConcreateColleague1
メディエータ(どちらか使用しません)

ない循環参照を使用し使用します!

答えて

5

循環依存がどこで発生するのかわかりません。 this diagramのクラスを実装すると、そのようなことは起こりません。

は、Delphiで、この図を実装するには、確かに

  • Mediatorインターフェースのいずれかを記述する必要があります(とあなたのConcreteMediatorクラスがこのインタフェースを実装する必要があり)(
  • または仮想メソッドを持つ基本Mediatorクラスを、 ConcreteMediatorクラスをMediatorから派生させ、これらのメソッドをオーバーライドしてください)。
+0

私は、GoFのDesign Patternsの書籍に記載されているMediatorパターンを参照しています。具体的には、274ページの図を参照してください。 'aButton'は 'aFontDialogDirector'への参照を持ち、逆に 'aFontDialogDirector'は 'aButton'への参照を持ちます。したがって、Delphiでは、これらの2つのクラスは同じUnit内になければなりません。 – awmross

+0

あなたの答えをもっと慎重に読んだら、今私はこれが正しいことを見ています。 1つのユニットに基本メディエータクラスを作成し、それを別のユニットにサブクラス化する必要があります。あなたの答えを編集する場合、私はdownvoteをupvoteに変更することができます:-) – awmross

7

インターフェイスを使用することは、ユニット間の依存関係を減少させるのに役立ちます。もう1つのアプローチは、クラス間の相互作用メソッドを定義する抽象基本クラスを持つことであり、それから具体的な子孫を別々のユニットに配置することです。

参照:デルファイのcirculare参照を避ける方法の詳細については、How to avoid circular unit reference?を参照してください。

2

メディエータと同僚を同じユニットに配置することも考慮する必要があります。多くの状況で、循環参照を避けるための慣用的なDelphiの方法です。

interfacesを使用すると、この種の問題に対処することはできますが、実際にはそれほど複雑ではない場合があります。

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

+0

私は5000行のファイルを分割しようとしているので、クラスを同じユニットに保ってもそれほど役に立ちません。しかし、他の状況では、これが可能な解決策になります。 – awmross

+2

@awmross 5000 lines ?!それは何もない、私の最大の32,000行があります。もっと重要なのは、大きなファイルを分割することはしばしば良い考えですが、互いに密接に関連しているものを保つことによって事態を悪化させることが常にあります。とにかく、あなたはこれをよく知っていると確信しています。 –

関連する問題