ホームページ  >  記事  >  Java  >  Java デザイン パターン メディエーター パターン

Java デザイン パターン メディエーター パターン

高洛峰
高洛峰オリジナル
2017-03-18 11:56:531390ブラウズ

メディエーター パターン

オブジェクト指向の設計では、さまざまなオブジェクト間の動作の分散が促進されますが、最悪の場合、各オブジェクトは他のすべてのオブジェクトについて認識する必要があります。システムを多数のオブジェクトに組み込むと再利用性が向上しますが、オブジェクト間の相互接続が急増すると再利用性が低下します。接続が多数になると、1 つのオブジェクトが他のオブジェクトの助けなしに動作できなくなります (システムは分割不可能な全体として動作します)。現時点ではシステムの動作に大きな変更を加えるのは非常に困難です。その動作は多くのオブジェクトに分散されているため、システムの動作をカスタマイズするには多くのサブクラスを定義する必要があります。オブジェクトメディエーター:

メディエーターオブジェクトを通じて、ネットワーク構造システムは、メディエーターを中心とするスター型構造に変換され、各特定のオブジェクトは、メディエーターオブジェクトを介して直接相互作用しなくなります。メディエーター オブジェクトの導入により、新しいオブジェクトの導入によるシステム構造の大幅な変更も防止されます。

Java デザイン パターン メディエーター パターンメディエーター モード: メディエーター モードとも呼ばれ、メディエーター オブジェクト (Mediator) を使用してシリーズの相互作用をカプセル化します。これにより、各オブジェクトが互いに明示的に参照する必要がなくなり、結合が緩和され、オブジェクト間の相互作用を独立して変更できるようになります:

(画像出典: デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの基礎) ) ヒント: 各同僚はメディエーターの存在のみを知っており、他の同僚が存在するかどうか (そうでない場合は切り離す方法) を知る必要はありません。メッセージをメディエーターに送信するだけでよく、メディエーターはそれを他の同僚に転送します。同僚 (すべての同僚関係は調停者によって保存され、調停者だけが何人の同僚がいるかを知っています)

Java デザイン パターン メディエーター パターンモードの実装

国連はさまざまな国からの声明を転送し、国家間の関係を調停します。国連安全保障理事会と安全保障理事会は、協力的な行動を達成するために適切な要求を行います:


Colleague

抽象同僚クラス、各同僚のパブリックメソッドを定義します:Java デザイン パターン メディエーター パターン

/**
 * @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("来呀, 来互相伤害呀!!!");
 }
}

--------------------- -------------------- ------------------------------ --------

概要

Mediator の出現により、Colleague 間の結合により、各 Colleague と Mediator を独立して変更して再利用できるようになり、オブジェクトがどのように連携するかを抽象化し、メディエーションをオブジェクトとして扱います。独立した概念をオブジェクトにカプセル化すると、オブジェクト自体の動作に焦点が当てられなくなり、システムをよりマクロな観点から見ることができるようになります。

• 適用性

中間モデルはシステムに適用するのが簡単ですが、システムに複雑な「多対多」の相互作用を持つオブジェクトのグループがある場合は、急いでメディエーターを使用しないでください。まず、システムの設計が合理的であるかどうかを検討するのが最善です。ConcreteMediator は集中化を制御するため、対話の複雑さが軽減されます。メディエーターになると、他の ConcreteColleague よりも複雑になります。メディエーター パターンを使用することをお勧めします。以下の状況では:

◦ オブジェクトのグループは、明確に定義されているものの、複雑な方法で通信します。その結果生じる相互依存関係は複雑で、理解するのが困難です。
◦ 1 つのオブジェクトが他の多くのオブジェクトを参照し、これらのオブジェクトと直接通信します。オブジェクトの再利用が難しい

◦ 子クラスをあまり生成せずに、複数のクラスに分散する動作をカスタマイズしたい

•関連パターン
◦ Facade と mediator の違いは、オブジェクト サブシステムを抽象化し、より便利なインターフェイスを提供することです。つまり、Facade オブジェクト クラスがリクエストを行いますが、その逆はありません。逆に、Mediator は、各 Colleague オブジェクトでサポートされていない、またはサポートできない共同動作を提供し、プロトコルは多方向です
◦ Colleague は、Mediator と通信するためにオブザーバー モードを使用できます

上記は、の内容です。この記事の内容はすべて、皆さんの学習に役立つことを願っています。また、皆さんが PHP 中国語 Web サイトをサポートしてくれることを願っています。

Java デザイン パターンの中間パターンに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連記事:

JavaでMediatorパターンを実装するコードの詳細な紹介

Javaデザインパターンの責任連鎖パターンの紹介

Javaのプロキシパターン(Proxyパターン)の紹介Java デザイン パターン

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。