メディエーターモード(メディエーター)の定義:メディエーターオブジェクトを使用して、一連のオブジェクトの相互作用をカプセル化します。仲介者は、各オブジェクトが相互に明示的に参照する必要がないようにするため、疎結合になり、オブジェクト間の相互作用を個別に変更できます。仲介モデルは仲介モデルとも呼ばれ、Dimitの法則の典型的な適用です。
シナリオの使用:
- オブジェクトのセットが明確に定義されているが複雑な方法で通信するシナリオ
- 複数のクラスに分散されている動作をカスタマイズしたいが、あまり多くのサブクラスを生成したくない場合
利点:
- 各クラスは、ディミットの法則に従って職務を遂行します。
- オブジェクト間の結合を減らし、オブジェクトを個別に再利用しやすくします。
- オブジェクト間の1対多の関連付けは、1対1の関連付けに変換されます。これにより、システムの柔軟性が向上し、システムの保守と拡張が容易になります。
短所:
- 一元化されているため、仲介者はオブジェクト間の相互作用の複雑さに耐えます。同僚が増えると、仲介者は肥大化し、複雑になり、維持が困難になります。
構造:
- 抽象メディエーター(メディエーター)の役割:これはメディエーターのインターフェースであり、同僚オブジェクトの登録と同僚オブジェクト情報の転送のための抽象メソッドを提供します。
- 具体的なメディエーターの役割:メディエーターインターフェイスを実装し、同僚のオブジェクトを管理するためのリストを定義し、同僚の役割間の相互作用を調整するため、同僚の役割に依存します。
- 抽象同僚クラス(同僚)の役割:同僚クラスのインターフェースを定義し、中間オブジェクトを保存し、同僚オブジェクトの相互作用の抽象メソッドを提供し、相互に影響を与える同僚クラスの共通機能を実現します。
- 具体的な同僚の役割:抽象同僚クラスの実装者です。他の同僚オブジェクトと対話する必要がある場合、中間オブジェクトが後続の対話を担当します。
コードの背景:米国は、イラクが核兵器を保有していると疑っており、戦争を開始すると脅迫している。国連安全保障理事会は、両国の言葉を仲介し、伝えている。
抽象的仲介者:国連機関
abstract class UnitedNations//联合国机构
{
//声明
public abstract void Declare(string message, Country colleague);
}
特定の仲介者:安全保障理事会
class UnitedNationsSecurityCouncil : UnitedNations//安理会了解所有国家,所以拥有美国和伊拉克的对象属性
{
private USA colleague1;
private Iraq colleague2;
//美国
public USA Colleague1
{
set{
colleague1=value;} }
//伊拉克
public Iraq Colleague2
{
set {
colleague2 = value; }
}
//声明
public override void Declare(string message, Country colleague)//重写实现两个对象间的通信
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
抽象同僚クラス:国
abstract class Country //国家
{
protected UnitedNations mediator;
public Country (UnitedNations mediator)
{
this.mediator = mediator;
}
}
特定の同僚のカテゴリ:米国、イラク
class USA:Country//美国
{
public USA(UnitedNations mediator):base(mediator)
{
}
//声明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//获得消息
public void GetMessage(string message)
{
Console.WriteLine("美国获得对方信息:"+message);
}
}
//伊拉克
class Iraq:Country
{
public Iraq(UnitedNations mediator):base(mediator)
{
}
//声明
public void Declare(string message)
{
mediator.Declare(message,this);
}
//获得消息
public void GetMessage(string message)
{
Console.WriteLine("伊拉克获得对方信息:"+message);
}
}
クライアント:
static void Main(string[] args)
{
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.Colleague1 = c1;//安理会传递话语
UNSC.Colleague2 = c2;
c1.Declare("不准研制核武器,否则要发动战争!");
c2.Declare("我们没有核武器,管好你自己。");
Console.Read();
}
}