定義:メディエーターオブジェクトとの一連のオブジェクトの相互作用をカプセル化します。メディエーターは、各オブジェクトを表示せずに対話させ、それにより結合を緩め、それらの間の相互作用を独立して変更します。
タイプ:動作クラスパターンクラス図:
中間モデルの構造
中間モードは、メディエーターモードとも呼ばれます。クラス図から、3つの部分に分かれています。
抽象メディエーター:同僚のクラスオブジェクトとメディエーターオブジェクトの間のインターフェイスを定義し、各同僚クラス間の通信に使用されます。一般に、1つまたは複数の抽象イベントメソッドが含まれ、サブクラスによって実装されます。
中間実装クラス:抽象的なメディエーターから継承され、抽象メディエーターで定義されたイベント方法を実装します。ある同僚クラスからメッセージを受信し、メッセージを通して他の同時クラスに影響を与えます。
同僚のクラス:オブジェクトが他のオブジェクトに影響を与え、他のオブジェクトの影響を受ける場合、これらの2つのオブジェクトは同僚クラスと呼ばれます。クラス図には、同僚のクラスが1つしかありません。これは実際には現実の省略です。実際のアプリケーションでは、同僚のクラスは一般に複数で構成されており、互いに影響を与え、依存しています。同僚が多いほど、関係が複雑になります。さらに、同僚のクラスは、同じ抽象クラスを継承する一連の実装として表現することもできます。仲介モデルでは、メッセージは同僚間の仲介者を介して送信する必要があります。
なぜ中間モデルを使用するのか
一般的に言えば、同僚のクラス間の関係は比較的複雑です。複数の同僚のクラスが相関している場合、その関係は複雑なメッシュ構造として表示されます。これは、過剰に結合されたアーキテクチャです。つまり、クラスの再利用を助長せず、安定していません。たとえば、下の図には、6つの同僚のようなオブジェクトがあります。オブジェクト1が変更されると、4つのオブジェクトが影響を受けます。オブジェクト2が変更されると、5つのオブジェクトが影響を受けます。言い換えれば、同僚間の直接的な相関の設計は良くありません。
仲介モデルが導入された場合、同僚のクラス間の関係は星構造になります。図から、どのクラスの変更がクラス自体と仲介者にのみ影響し、システムの結合が減少することがわかります。優れたデザインは、このクラスのすべてのオブジェクト関連処理ロジックを間違いなくカプセル化することはありませんが、特別なクラスを使用して、あなたに属さない動作を管理します。
例
以下は特定のコードの例です。一般的なクラス図と比較して、AbstractColleagueの抽象同僚クラスとAbstractMediator Abstractメディエーターが追加されています。さらに、2つの特定の同僚クラスと1つの特定のメディエーターがあります。コードには多くのコメントがあり、対応するクラス図は示されていません。理解するのは難しいことではありません。
同僚:
// Abstract Colleague Class Abstract Class AbstractColleague {Protected AbstractMediator Mediator; /**仲介者がいるので、特定の同僚はそれぞれ仲介者と連絡を取る必要があります*そうでなければ、このシステムに存在する必要はありません。ここのコンストラクターは、システムと仲介者を登録してタッチすることに相当します。 } //抽象的な同僚クラスのパブリックvoid mediator(abstractmediator mediator)に仲介者に連絡する(つまり、登録){this.mediator = mediator; }} //特定の同僚クラスの同僚はAbstractColleagueを拡張します{//すべての特定の同僚は、親クラスのコンストラクターPublic Colleaguea(AbstractMediator Mediator){Super(Mediator); } //すべての特定の同僚は彼自身のタスクを持っている必要があり、外の世界の公共void self(){system.out.println( "colleaguea->あなた自身のタスク..."); } //すべての特定の同僚は、常に外の世界と対話し、これらのロジックを処理し、調停者のpublic void out(){system.out.println( "colleaguea->同僚Bを要求するパートタイムの仕事をするように要求します..."); super.mediator.execute( "colleagueb"、 "self"); }} //特定の同僚BクラスColleaguebはAbstractColleague {public CollegeB(AbstractMediator Mediator){Super(Mediator); } public void self(){system.out.println( "同僚B->パートタイムの仕事をする..."); } public void out(){system.out.println( "同僚B->同僚Aにパートタイムの仕事をするように要求..."); super.mediator.execute( "colleaguea"、 "self"); }}中間カテゴリ:
// Abstract Intermediary Abstract class AbstractMediator {//中間者は、いくつかの同僚の連絡先情報を保護する必要があります。 //仲介者は、同僚との接触を動的に確立できます。 } //仲介者は、同僚との連絡先を動的にキャンセルすることもできます。 } //仲介者は、ロジックを処理し、タスクを割り当て、同僚間の通信を促進するための操作が必要です。 } //特定の仲介クラスメディエーターは抽象化されたメディエーターを拡張します{//仲介者の最も重要な機能は、同僚の間で前後に実行することですパブリックvoid execute(string name、string method){if( "self" .equals(method)){//各人は自分の関税を行います( "Colleaguea"。 (Colleaguea)super.colleagues.get( "colleaguea"); colleague.self(); } else {colleagueb colleague =(colleagueb)super.colleagues.get( "colleagueb"); colleague.self(); }} else {//他の同僚との大学if( "colleaguea" .equals(name)){colleaguea colleague =(colleaguea)super.colleagues.get( "colleaguea"); colleague.out(); } else {colleagueb colleague =(colleagueb)super.colleagues.get( "colleagueb"); colleague.out(); }}}}}テストクラス:
// Class Class Public Class Client {public static void main(string [] args){//中間抽象メディエーターMediator = new Mediator();を作成します。 // 2人の同僚を作成する同僚の同僚=新しい同僚(メディエーター); Colleagueb Colleagueb = new Colleagueb(Mediator); //仲介者は、各同僚のメディエーターとの接触を確立します。AddColleague(「同僚」、同僚); mediator.addcolleague( "colleagueb"、colleagueb); //同僚はColleaguea.self()の作業を開始します。 Colleaguea.out(); System.out.println( "============================================================================================== =============================================================================== ================================================================================ =============================================================================== ================================================================================ ================================================================================ ================================================================================テスト結果:
同僚A->あなたの職務であなたの役割を果たします...同僚A->同僚Bにあなたの職務であなたの役割を尋ねてください...>あなたの職務であなたの役割を果たす... ===========================================================================同僚B->あなたの職務であなたの役割を果たす...同僚B->同僚Aにあなたの職務であなたの役割を果たすように頼む...>あなたの職務であなたの役割を果たす... =========================================================================================
上記のコードには2つの特定の同僚クラスのみがあり、テストクラスで2つの同僚のみが作成されていますが、仲介モデルの目的、つまり特定の同僚のクラスを追加することに従ってこれらを適切に拡張できます。なぜ?現在、上記のメディエータークラスには、execute()メソッドに長い判断コードがたくさんあることがわかります。メディエータークラスの他のプライベートメソッドに分解して追加できますが、特定のビジネスロジックは不可欠です。
したがって、同僚間のつながりを切り離す一方で、仲介者自体もオーバーザトップのタスクと矛盾しています。これは、ほとんどすべてのビジネスロジックが「非常に期待される」役割として説明できる仲介者に説明されるためです。これは、仲介モデルの欠点です。
さらに、上記のコードの例は非常に理想的です。 「同僚」間の共通性を抽出して、抽象的なコラーグの抽象的な同僚クラスを形成することができない場合があります。
改訂:
上記の「アプリに公開された双方向協会」の上記のコードの実装には欠点があるため、与えられた改善方法2によると、上級ベンジーリンによって提案されているため、上記のコードを次のように変更します。
修正された同僚:
// Abstract Class AbstractColleague {Protected AbstractMediator Mediator; //コンストラクターのメディエーターとの接続を確立するのを停止します//} //メソッドを抽象的な同僚クラスに追加して、メディエーター(つまり登録)に連絡する(登録)public void setMediator(abstractmediatorメディエーター){this.mediator = mediator; }} //特定の同僚クラスの同僚は、AbstractColleagueを拡張します{//コンストラクターのメディエーターとのつながりを確立しないでください// public collegea(abstractmediator mediator){// super(mediator); //} //すべての特定の同僚は彼自身の部分の彼自身の部分を持っている必要があり、外の世界の公共のvoid self(){system.out.println( "colleaguea->彼の部分の一部を行う..."); } //特定のすべての同僚は、常に外の世界と対話し、これらのロジックを処理し、調停者のpublic void out(){system.out.println( "colleaguea->彼の部分の一部を実行するように同僚Bを要求する..."); super.mediator.execute( "colleagueb"、 "self"); }} //特定の同僚BクラスColleaguebがAbstractColleagueを拡張します{//コンストラクターのメディエーターとの接続を確立するのを停止// Public Colleagueb(AbstractMediator Mediator){// Super(Mediator); //} public void self(){system.out.println( "colleagueb-> do your port ..."); } public void out(){system.out.println( "colleagueb->同僚にあなたの役割を尋ねる..."); super.mediator.execute( "colleaguea"、 "self"); }}
修正された仲介:
// Abstract Intermediary Abstract class AbstractMediator {//中間者は、いくつかの同僚の連絡先情報を保護する必要があります。 //仲介者は、同僚との接触を動的に確立できます。 this.colleagues.put(name、c); } //仲介者は、同僚との接触を動的に取り消すこともできます。 } //仲介者は、ロジックを処理し、タスクを割り当て、同僚間の通信を促進するための操作が必要です。 } //テストクラスのパブリッククラスクライアント{public static void main(string [] args){//中間抽象メディエーターmediator = new Mediator(); //コンストラクターは、特定の同僚の仲介者を登録して連絡を取るために使用されます// colleagueb colleagueb = new Colleagueb(Mediator); Colleaguea Colleaguea = new Colleaguea(); colleagueb colleagueb = new colleaguegb(); //仲介者は、各同僚のメディエーターとの接触を確立します。AddColleague(「同僚」、同僚); mediator.addcolleague( "colleagueb"、colleagueb); //同僚はColleaguea.self()の作業を開始します。 Colleaguea.out(); System.out.println( "===================================================== ============================================================================= ============================================================================= ============================================================================ ============================================================================= ============================================================================= ============================================================================= ============================================================================テスト後の結果は、変更前と同じです。