1 はじめに
1.1. 概要
次の図に示すように、システム内のオブジェクト間の関係がネットワーク構造になっている場合、
オブジェクト間には多数の多対多の関係が存在し、非常に複雑なシステムになります。他のオブジェクトから影響を受けるこれらのオブジェクトは同僚オブジェクトと呼ばれ、相互作用を通じてシステムの動作を実現します。ネットワーク構造では、ほぼすべてのオブジェクトが他のオブジェクトと相互作用する必要があり、この相互作用は、あるオブジェクトと別のオブジェクトの直接結合として現れ、システムの過剰結合につながります。
Mediator パターンを使用すると、オブジェクト間の関係の数を大幅に減らすことができます。メディエーター オブジェクトを導入すると、次の図に示すように、システムのネットワーク構造をメディエーターを中心としたスター型構造に変更できます。
このスター型構造では、同僚オブジェクトは他のオブジェクトと直接接続されなくなり、他のオブジェクトと直接接続されなくなります。メディエーター オブジェクトは別のオブジェクトと対話します。中間オブジェクトの存在により、オブジェクト構造の安定性が保証されます。つまり、システムの構造は、新しいオブジェクトの導入によって多くの変更作業が発生することはありません。
システム内のオブジェクト間に多対多の関係がある場合、オブジェクト間の対話的な動作の一部を各オブジェクトから分離して中間オブジェクトにカプセル化することができ、中間オブジェクトが統一された調整を実行します。 - オブジェクト間の多数の複雑な関係が、比較的単純な 1 対多の関係に変換されます。仲介者を導入してオブジェクト間の複雑な相互作用を簡素化することにより、仲介者パターンはデメテルの法則の典型的な応用となります。
1.2. 定義
メディエーター パターン: メディエーター オブジェクト (メディエーター) を使用して、一連のオブジェクトの対話をカプセル化します。メディエーターにより、オブジェクトが相互に明示的に参照する必要がなくなり、オブジェクトが疎結合になり、オブジェクトの相互作用を独立して変更できます。メディエーター モードは、メディエーター モードとも呼ばれ、オブジェクト動作モードです。
2. 分析
2.1、UML クラス図
中間モードでは、他のオブジェクト/クラス間の相互呼び出しを調整するために使用される中間クラスが導入されます。システムをより柔軟でスケーラブルにするために、通常は抽象的な仲介手段が提供されます。その構造図を次の図に示します。
中間モデルの構造図には次の 4 つの役割が含まれています。
- Mediator (抽象メディエーター): 各同僚オブジェクトと通信するために使用されるインターフェイスを定義します。
- ConcreteMediator (コンクリートメディエーター): 抽象メディエーターのサブクラスであり、各同僚オブジェクトを調整することで協調動作を実現し、各同僚オブジェクトへの参照を保持します。
- Colleague (抽象同僚クラス): 各同僚クラスのパブリック メソッドを定義し、サブクラスが実装するためのいくつかの抽象メソッドを宣言し、サブクラスが中間クラスまたは通信と通信できる抽象中間クラスへの参照を維持します。
- ConcreteColleague (具体的な同僚クラス): 抽象的な同僚クラスのサブクラスです。各同僚オブジェクトが他の同僚オブジェクトと通信する必要がある場合、最初に仲介者と通信し、仲介者を通じて間接的に他の同僚クラスとの通信を完了します。抽象同僚クラスで宣言された抽象メソッドは、具体的な同僚クラスに実装されます。
メディエーター パターンの中核は、メディエーター クラスの導入です。中間モデルでは、中間クラスは次の 2 つの役割を引き受けます。
(1) 遷移の役割 (構造的)。メディエータによって提供される中継機能により、各同僚オブジェクトは他の同僚を明示的に参照する必要がなくなりました。他の同僚と通信する必要がある場合は、仲介者を介して間接的な通話を実装できます。この転送の役割は、仲介者の構造的サポートに属します。
(2) 調整(行動)。仲介者は同僚間の関係をさらにカプセル化することができ、同僚は仲介者が何をする必要があるかを指定せずに一貫した方法で仲介者と対話できます。仲介者は、それ自体にカプセル化された調整ロジックに従って同僚のリクエストをさらに処理し、同僚間の関係動作を分離してカプセル化します。この調整の役割は、仲介者の行動のサポートに属します。
2.2. コード例
中間モードでは、典型的な抽象中間クラス コードは次のとおりです。
/**
* @Description: 抽象中介者
* @Author: yangyongbing
* @CreateTime: 2023/08/03 08:56
* @Version: 1.0
*/
public class Mediator {
// 存储同事对象
protected ArrayList<Colleague> colleagues;
// 注册方法,用于增加同事对象
public void register(Colleague colleague){
colleagues.add(colleague);
}
// 声明抽象的业务方法
public void operation() {
}
}
コ同僚クラスのコレクションは、抽象中間クラスで定義できます。これは、同僚オブジェクトを格納し、登録メソッドを提供するために使用され、同時に具象中間クラスのメソッドを宣言します。これらの抽象メソッドは具体的な中間クラスに実装されます。典型的な具体的な中間クラスのコードは次のとおりです。
/**
* @Description: 具体中介者
* @Author: yangyongbing
* @CreateTime: 2023/08/03 08:58
* @Version: 1.0
*/
public class ConcreteMediator extends Mediator{
// 实现业务方法,封装同事之间的调用
public void operation(){
// 通过中介者调用同事类的方法
colleagues.get(0).method();
}
}
特定の中間クラスでは、同僚クラスのメソッドが呼び出され、呼び出し時に呼び出しを制御するための独自のビジネス コードを追加できます。
抽象メディエーターへの参照は、抽象同僚クラスで維持され、メディエーターのメソッドを呼び出すために使用されます。典型的な抽象同僚クラスのコードは次のとおりです。
/**
* @Description: 抽象同事类
* @Author: yangyongbing
* @CreateTime: 2023/08/03 09:02
* @Version: 1.0
*/
public class Colleague {
// 维持一个抽象中介者的引用
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
// 声明自身方法,处理自己的行为
public void method() {
}
// 定义依赖方法,与中介者进行通信
public void dependencyMethod(){
mediator.operation();
}
}
同僚クラスの抽象メソッドは抽象同僚クラスで宣言され、これらのメソッドは具象同僚クラスに実装されます。典型的な特定の同僚クラスのコードは次のとおりです。
/**
* @Description: 具体同事类
* @Author: yangyongbing
* @CreateTime: 2023/08/03 09:06
* @Version: 1.0
*/
public class ConcreteColleague extends Colleague{
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
// 实现自身方法
public void method(){
}
}
抽象同僚クラスで宣言されたメソッドは、具体的な同僚クラス ConcreteColleague に実装されます。メソッド () は、同僚クラスの自己メソッド (Self-Method) であり、自身の動作を処理するために使用されます。メソッド dependencyMethod() は依存メソッド (Depend-Method) であり、仲介で定義されたメソッドを呼び出し、仲介に依存して対応する動作 (別の同僚クラスの関連メソッドの呼び出しなど) を完了するために使用されます。
3. 中間モデルの概要
Mediator パターンは、メッシュ システム構造を Mediator オブジェクトを中心とするスター構造に変換します。このスター構造では、元のオブジェクト間の多対多の関係が、メディエーター オブジェクトと他のオブジェクト間の 1 対多の関係に置き換えられます。中間モデルは、イベント駆動型ソフトウェア、特に GUI ベースのアプリケーション ソフトウェアで広く使用されています。さらに、メディエーター パターンは、クラス間に複雑な関連性があるシステムによく適用されています。
3.1. 主な利点
- メディエーター パターンはオブジェクト間の対話を簡素化し、同僚間の元の多対多の対話をメディエーターと同僚間の 1 対多の対話に置き換えます。1 対多の関係は理解、維持、拡張が容易であり、他の方法では理解できないメッシュ構造を比較的単純なスター構造に変換します。
- メディエーター パターンは、各同僚オブジェクトを分離します。仲介者は同僚間の疎結合に役立ち、各同僚と仲介者は独立して変更して再利用できます。新しい仲介者と新しい同僚を追加する方が便利で、オープンとクローズの原則によく適合します。
- 多数の同僚サブクラスの生成を削減できます。仲介者は、もともと複数のオブジェクト間で分散されていた動作を収集します。これらの動作を変更するには、新しい中間サブクラスを生成するだけで済みます。これにより、同僚クラスを拡張せずに各同僚クラスを再利用できるようになります。
3.2. 主な欠点
中間モデルの主な欠点は、同僚間の対話の詳細が特定の中間クラスに多数含まれるため、特定の中間クラスが非常に複雑になり、システムの保守が困難になる可能性があることです。
3.3. 適用可能なシナリオ
- システム内のオブジェクト間には複雑な参照関係があり、システム構造が複雑で理解しにくいです。
- オブジェクトは他の多くのオブジェクトを参照し、これらのオブジェクトと直接通信するため、再利用が困難です。
- 中間クラスを通じて複数のクラスの動作をカプセル化したいのですが、あまり多くのサブクラスを生成したくありません。これは、メディエーター クラスを導入し、メディエーターでのオブジェクト インタラクションのパブリック動作を定義し、動作を変更する必要がある場合は新しい特定のメディエーター クラスを追加することで実現できます。