デザインパターン メディエーターパターンノート
説明する
デザインパターン・メディエーターパターンの学習の書き方を記録します。使用される JDK バージョンはバージョン 1.8 です。
調停者
意図: 仲介オブジェクトを使用して、一連のオブジェクトの対話をカプセル化します。メディエーターにより、オブジェクトが相互に明示的に参照する必要がなくなるため、オブジェクトは疎結合になり、相互作用を独立して変更できます。
構造:
で:
- Mediator は、Colleague オブジェクト間の通信のためのインターフェイスを定義します。
- ConcreteMediator (具体的なメディエーター) は、各同僚オブジェクトを調整することで協調動作を実現し、同僚を理解し、維持します。
- ConcreteSubject (特定のターゲット) は、関連するステータスを各 ConcreteObserver オブジェクトに保存し、そのステータスが変化すると、各オブザーバーに通知を送信します。
- Colleague クラスはそのメディエータ オブジェクトを認識しており、各 Colleague クラス オブジェクトは、他の同僚と通信する必要がある場合にそのメディエータと通信します。
適用性:
- オブジェクトのセットは、明確に定義されているものの複雑な方法で通信するため、構造が複雑で理解しにくい相互依存関係が生じます。
- オブジェクトは他の多くのオブジェクトを参照し、これらのオブジェクトと直接通信するため、オブジェクトの再利用が困難になります。
- サブクラスをあまり生成せずに、複数のクラスに分散される動作をカスタマイズしたいと考えています。
目次
メディエーター パターンのクラス図の例
この UML クラス図を使用して、メディエーター パターンの例を実装します。
抽象メディエータークラス
package com.example.deesign_patterns.mediator;
//抽象中介者类
public abstract class Mediator {
//联系方法
public abstract void contact(String message,Person person);
}
抽象的な同僚クラス
package com.example.deesign_patterns.mediator;
//抽象同事类
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
賃貸人
package com.example.deesign_patterns.mediator;
//租房者类,具体的同事角色类
public class Tenant extends Person{
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
//和中介联系(沟通)的方法
public void contact(String message){
mediator.contact(message,this);
}
//获取信息的方法
public void getMessage(String message){
System.out.println("租房者"+name+"获取到的信息是:"+message);
}
}
家主
package com.example.deesign_patterns.mediator;
//房主类,具体的同事角色类
public class HouseOwner extends Person{
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
//和中介联系(沟通)的方法
public void contact(String message){
mediator.contact(message,this);
}
//获取信息的方法
public void getMessage(String message){
System.out.println("房主"+name+"获取到的信息是:"+message);
}
}
特定のメディエーター役割クラス
package com.example.deesign_patterns.mediator;
//具体的中介者角色类
public class MediatorStructure extends Mediator{
//聚合租房者和房主对象
private Tenant tenant;
private HouseOwner houseOwner;
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
@Override
public void contact(String message, Person person) {
if(person==houseOwner){
tenant.getMessage(message);
}else {
houseOwner.getMessage(message);
}
}
}
テストクラス
package com.example.deesign_patterns.mediator;
//测试类
public class Client {
public static void main(String[] args) {
//创建中介者对象
MediatorStructure mediator=new MediatorStructure();
//创建租房者对象
Tenant tenant=new Tenant("李四",mediator);
//创建房主对象
HouseOwner houseOwner=new HouseOwner("张三",mediator);
//中介者要知道具体的房主和租房者
mediator.setTenant(tenant);
mediator.setHouseOwner(houseOwner);
tenant.contact("我要租三室的房子!!!");
houseOwner.contact("我这里有三室的房子,你要租吗?");
}
}
利点:
- 疎結合。メディエーター パターンは、複数の同僚オブジェクト間の相互作用をメディエーター オブジェクトにカプセル化することで、同僚オブジェクトを疎結合し、基本的に相補的な依存関係を実現します。このようにして、以前のように「1 つの場所を移動して本体全体に影響を与える」のではなく、同僚オブジェクトを個別に変更して再利用することができます。
- インタラクションを一元管理します。複数の同僚オブジェクトのインタラクションは、メディエーター オブジェクトにカプセル化されて一元管理されるため、これらのインタラクティブな動作が変更された場合は、メディエーター オブジェクトを変更するだけで済みます。もちろん、すでに完成したシステムの場合は、メディエーター オブジェクトを拡張します。各同僚クラスを変更する必要はありません。
- 1 対多の関連付けは 1 対 1 の関連付けに変換されます。メディエーター パターンが使用されていない場合、同僚オブジェクト間の関係は通常 1 対多ですが、メディエーター オブジェクトの導入後は、通常、メディエーター オブジェクトと同僚オブジェクトの関係は双方向の 1 対 1 の関係になります。これにより、オブジェクト間の関係が理解しやすくなり、実装が容易になります。
欠点:
- 共同クラスが多すぎると、調停者の責任が大きくなり、複雑かつ大規模になり、システムの維持が困難になります。