メディエーター パターン
オブジェクト指向の設計では、さまざまなオブジェクト間の動作の分散が促進されますが、最悪の場合、各オブジェクトは他のすべてのオブジェクトについて認識する必要があります。システムを多数のオブジェクトに組み込むと再利用性が向上しますが、オブジェクト間の相互接続が急増すると再利用性が低下します。接続が多数になると、1 つのオブジェクトが他のオブジェクトの助けなしに動作できなくなります (システムは分割不可能な全体として動作します)。現時点ではシステムの動作に大きな変更を加えるのは非常に困難です。その動作は多くのオブジェクトに分散されているため、システムの動作をカスタマイズするには多くのサブクラスを定義する必要があります。オブジェクトメディエーター:
メディエーター モード: メディエーター モードとも呼ばれ、メディエーター オブジェクト (Mediator) を使用してシリーズの相互作用をカプセル化します。これにより、各オブジェクトが互いに明示的に参照する必要がなくなり、結合が緩和され、オブジェクト間の相互作用を独立して変更できるようになります:
(画像出典: デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの基礎) ) ヒント: 各同僚はメディエーターの存在のみを知っており、他の同僚が存在するかどうか (そうでない場合は切り離す方法) を知る必要はありません。メッセージをメディエーターに送信するだけでよく、メディエーターはそれを他の同僚に転送します。同僚 (すべての同僚関係は調停者によって保存され、調停者だけが何人の同僚がいるかを知っています)モードの実装
国連はさまざまな国からの声明を転送し、国家間の関係を調停します。国連安全保障理事会と安全保障理事会は、協力的な行動を達成するために適切な要求を行います:
Colleague
抽象同僚クラス、各同僚のパブリックメソッドを定義します:
/** * @author jifang * @since 16/8/28 下午4:22. */ public abstract class Country { protected UnitedNations mediator; private String name; public Country(UnitedNations mediator, String name) { this.mediator = mediator; this.name = name; } public String getName() { return name; } protected abstract void declare(String msg); protected abstract void receive(String msg); }-------- ------------------------ ------------------------ ------------------------ ------------具体的な同僚具体的な同僚クラス:
•各同僚クラスは知っていますメディエーター オブジェクトです。
•各同僚オブジェクトが他の同僚と通信する必要がある場合、その中間通信class USA extends Country { public USA(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("美国接收到: [" + msg + "]"); } } class Iraq extends Country { public Iraq(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("伊拉克接收到: [" + msg + "]"); } } class China extends Country { public China(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("中国接收到: [" + msg + "]"); } }----------------------- と通信します。 ------------------ -------------------------------- -------
Mediator
public abstract class UnitedNations { protected List<Country> countries = new LinkedList<>(); public void register(Country country) { countries.add(country); } public void remove(Country country) { countries.remove(country); } protected abstract void declare(Country country, String msg); }-------- ------------------------ ---------------------------- --------------ConcreteMediator特定のメディエーター:
•さまざまな同僚を理解し、維持します;
•各同僚オブジェクトを調整することによって共同動作を実現します (同僚からメッセージを受信し、同僚にコマンドを発行します)class UnitedNationsSecurityCouncil extends UnitedNations { /** * 安理会在中间作出调停 * * @param country * @param msg */ @Override protected void declare(Country country, String msg) { for (Country toCountry : countries) { if (!toCountry.equals(country)) { String name = country.getName(); toCountry.receive(name + "平和的说: " + msg); } } } }拡張機能がない場合は、Mediator を ConcreteMediator For one と組み合わせることができます。
•クライアント
public class Client { @Test public void client() { UnitedNations mediator = new UnitedNationsSecurityCouncil(); Country usa = new USA(mediator, "美国"); Country china = new China(mediator, "中国"); Country iraq = new Iraq(mediator, "伊拉克"); mediator.register(usa); mediator.register(china); mediator.register(iraq); usa.declare("我要打伊拉克, 谁管我跟谁急!!!"); System.out.println("----------"); china.declare("我们强烈谴责!!!"); System.out.println("----------"); iraq.declare("来呀, 来互相伤害呀!!!"); } }
概要
• 適用性
中間モデルはシステムに適用するのが簡単ですが、システムに複雑な「多対多」の相互作用を持つオブジェクトのグループがある場合は、急いでメディエーターを使用しないでください。まず、システムの設計が合理的であるかどうかを検討するのが最善です。ConcreteMediator は集中化を制御するため、対話の複雑さが軽減されます。メディエーターになると、他の ConcreteColleague よりも複雑になります。メディエーター パターンを使用することをお勧めします。以下の状況では:◦ オブジェクトのグループは、明確に定義されているものの、複雑な方法で通信します。その結果生じる相互依存関係は複雑で、理解するのが困難です。
◦ 1 つのオブジェクトが他の多くのオブジェクトを参照し、これらのオブジェクトと直接通信します。オブジェクトの再利用が難しい
•関連パターン
◦ Facade と mediator の違いは、オブジェクト サブシステムを抽象化し、より便利なインターフェイスを提供することです。つまり、Facade オブジェクト クラスがリクエストを行いますが、その逆はありません。逆に、Mediator は、各 Colleague オブジェクトでサポートされていない、またはサポートできない共同動作を提供し、プロトコルは多方向です
◦ Colleague は、Mediator と通信するためにオブザーバー モードを使用できます
上記は、の内容です。この記事の内容はすべて、皆さんの学習に役立つことを願っています。また、皆さんが PHP 中国語 Web サイトをサポートしてくれることを願っています。
Java デザイン パターンの中間パターンに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。
関連記事: