この記事では、主にデザインパターンの中間パターンの関連情報を詳しく紹介します。興味のある方は参考にしてください。
定義: 一連のオブジェクトインタラクションをカプセル化するために中間オブジェクトを使用します。 mediator を使用すると、明示的な相互作用なしでオブジェクトが相互作用できるため、結合が緩やかになり、オブジェクト間の相互作用を独立して変更できます。
タイプ: 行動パターン
クラス図:
中間パターンの構造
クラス図から、中間パターンはメディエーターパターンとも呼ばれます。パート:
抽象メディエーター: さまざまな同僚クラス間の通信に使用される、同僚クラス オブジェクトからメディエーター オブジェクトへのインターフェイスを定義します。通常、1 つまたは複数の抽象イベント メソッドが含まれており、サブクラスによって実装されます。
Mediator 実装クラス: 抽象メディエーターから継承され、抽象メディエーターで定義されたイベント メソッドを実装します。ピア クラスからメッセージを受信し、そのメッセージを通じて他の並行クラスに影響を与えます。
同僚クラス: オブジェクトが他のオブジェクトに影響を与え、また他のオブジェクトからも影響を受ける場合、これら 2 つのオブジェクトは同僚クラスと呼ばれます。クラス図では同僚クラスが 1 つだけありますが、これは実際には省略されています。実際のアプリケーションでは、同僚クラスは通常複数のクラスで構成され、相互作用し、相互に依存します。同僚の種類が増えるほど、関係はより複雑になります。さらに、同僚クラスは、同じ抽象クラスを継承する実装のグループとして表すこともできます。メディエーター パターンでは、メッセージはメディエーターを通じて同僚クラス間で受け渡される必要があります。
なぜ中間パターンを使用するのか
一般に、複数の同僚クラスが相互に関連している場合、それらの間の関係は複雑なネットワークとして現れます。過度に結合されたアーキテクチャは、クラスの再利用に役立たず、不安定でもあります。たとえば、次の図では、6 つの同僚クラス オブジェクトがあり、オブジェクト 1 が変更されると、4 つのオブジェクトが影響を受けます。オブジェクト 2 が変更されると、5 つのオブジェクトが影響を受けます。言い換えれば、同僚クラス間の直接相関の設計は適切ではありません。
図から分かるように、中間パターンが導入されると、同僚クラス間の関係は、クラス自体と中間クラスにのみ影響を及ぼします。システムのカップリング。優れた設計では、すべてのオブジェクト関係処理ロジックがこのクラスにカプセル化されるわけではありませんが、自分に属さない動作を管理するために特別なクラスが使用されます。
例を使用して同僚クラスが何であるかを説明しましょう。クラス A と B の 2 つがあります。各クラスには番号があり、クラス B の番号が常にクラス B の番号の 100 倍であることを確認する必要があります。クラスA。つまり、クラス A の数値を変更する場合は、その数値を 100 倍してクラス B に割り当て、クラス B を変更する場合は、その数値を 100 で割ってクラス A に割り当てます。クラス A とクラス B は相互に対話し、共クラスと呼ばれます。コードは次のとおりです。
abstract class AbstractColleague { protected int number; public int getNumber() { return number; } public void setNumber(int number){ this.number = number; } //抽象方法,修改数字时同时修改关联对象 public abstract void setNumber(int number, AbstractColleague coll); } class ColleagueA extends AbstractColleague{ public void setNumber(int number, AbstractColleague coll) { this.number = number; coll.setNumber(number*100); } } class ColleagueB extends AbstractColleague{ public void setNumber(int number, AbstractColleague coll) { this.number = number; coll.setNumber(number/100); } } public class Client { public static void main(String[] args){ AbstractColleague collA = new ColleagueA(); AbstractColleague collB = new ColleagueB(); System.out.println("==========设置A影响B=========="); collA.setNumber(1288, collB); System.out.println("collA的number值:"+collA.getNumber()); System.out.println("collB的number值:"+collB.getNumber()); System.out.println("==========设置B影响A=========="); collB.setNumber(87635, collA); System.out.println("collB的number值:"+collB.getNumber()); System.out.println("collA的number值:"+collA.getNumber()); } }
上記のコードでは、クラス A とクラス B は直接関連付けによって関連付けられています。中間モードを使用したい場合は、クラス A とクラス B を直接関連付けることはできません。提携の目的は仲介者を通じて達成されます。
abstract class AbstractColleague { protected int number; public int getNumber() { return number; } public void setNumber(int number){ this.number = number; } //注意这里的参数不再是同事类,而是一个中介者 public abstract void setNumber(int number, AbstractMediator am); } class ColleagueA extends AbstractColleague{ public void setNumber(int number, AbstractMediator am) { this.number = number; am.AaffectB(); } } class ColleagueB extends AbstractColleague{ @Override public void setNumber(int number, AbstractMediator am) { this.number = number; am.BaffectA(); } } abstract class AbstractMediator { protected AbstractColleague A; protected AbstractColleague B; public AbstractMediator(AbstractColleague a, AbstractColleague b) { A = a; B = b; } public abstract void AaffectB(); public abstract void BaffectA(); } class Mediator extends AbstractMediator { public Mediator(AbstractColleague a, AbstractColleague b) { super(a, b); } //处理A对B的影响 public void AaffectB() { int number = A.getNumber(); 。 B.setNumber(number*100); } //处理B对A的影响 public void BaffectA() { int number = B.getNumber(); A.setNumber(number/100); } } public class Client { public static void main(String[] args){ AbstractColleague collA = new ColleagueA(); AbstractColleague collB = new ColleagueB(); AbstractMediator am = new Mediator(collA, collB); System.out.println("==========通过设置A影响B=========="); collA.setNumber(1000, am); System.out.println("collA的number值为:"+collA.getNumber()); System.out.println("collB的number值为A的10倍:"+collB.getNumber()); System.out.println("==========通过设置B影响A=========="); collB.setNumber(1000, am); System.out.println("collB的number值为:"+collB.getNumber()); System.out.println("collA的number值为B的0.1倍:"+collA.getNumber()); } }
コードは比較的長いですが、実際には、オブジェクトの関係を処理する元のコードを中間クラスに再カプセル化し、この中間クラスを使用して処理します。オブジェクト間の関係。
メディエーター パターンの利点
メディエーター パターンを適切に使用すると、同僚クラス間の過度の結合を回避し、各同僚クラスを比較的独立して使用できるようになります。
メディエーターパターンを使用すると、オブジェクト間の 1 対多の関連付けを 1 対 1 の関連付けに変換でき、オブジェクト間の関係を理解し、維持しやすくなります。
メディエーターパターンを使用すると、オブジェクトの動作や連携を抽象化でき、オブジェクト間の相互作用をより柔軟に扱うことができます。
該当するシナリオ
オブジェクト指向プログラミングでは、クラスは必然的に他のクラスへの依存関係を持ち、完全に独立したクラスは意味がありません。クラスが同時に複数のクラスに依存することもよくあることなので、1 対多の依存関係には合理性があり、メディエーター パターンを適切に使用すると、本来の関係が混乱する可能性があります。オブジェクト関係は明らかですが、乱用すると逆効果になる可能性があります。一般に、メディエーター パターンは、同僚クラス間のネットワーク構造との関係についてのみ考慮されます。ネットワーク構造をスター構造に変更して、クラス間の関係を明確にすることができます。
中間モデルはよく使われるモデルであり、悪用されやすいモデルでもあります。ほとんどの場合、同僚クラス間の関係は混沌としたネットワーク構造ほど複雑ではないため、ほとんどの場合、同僚クラス内のオブジェクト間の依存関係をカプセル化するだけで十分です。モード。中間モデルを悪用すると、事態はさらに複雑になるだけです。
以上がJava デザインパターンの詳細説明 Mediator パターンについて (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。