オブジェクト同士で通信する場合、Mediatorというオブジェクトを介して通信を行うパターン。
/// <summary>
/// Mediatorパターンのサンプルコード
/// </summary>
class MyMediator
{
Dictionary<string, MyColleague> _colleagues = [];
public void AddCollegue(MyColleague obj)
{
_colleagues.Add(obj.Name, obj);
}
public void Send(string from, string to, string message)
{
if (_colleagues.ContainsKey(to))
{
_colleagues[to].Receive(from, message);
}
}
}
class MyColleague
{
public string Name {get; set;}
MyMediator _mediator;
public MyColleague(string name, MyMediator mediator)
{
Name = name;
_mediator = mediator;
_mediator.AddCollegue(this);
}
public void Send(string to, string message)
{
_mediator.Send(this.Name, to, message);
}
public void Receive(string from, string message)
{
Console.WriteLine($"{from} {message}");
}
}
class Program
{
static public void Main()
{
var m = new MyMediator();
var jon = new MyColleague("JON", m);
var bob = new MyColleague("BOB", m);
jon.Send(bob.Name, "Hello BOB");
// JON Hello BOB
bob.Send(jon.Name, "Hello JON");
// BOB Hello JON
}
}
無線でLANを構築している場合、アクセスポイント(ルーター)がMediatorで、クライアントのPCがColleagueに相当し、PC間でメッセージを送り合うシステムを、C#のコンソールプロジェクトで表現しています。
と考えますと、サンプルコードでは色々と足りないものが見えてきますが、そもそもオブジェクト間で通信するようなコードを書く状況に遭遇したことが無いので、これ以上掘り下げずに次のパターンの学習に着手したいと思います。
コメント