GoFの「Mediator」パターンの探究

今日は、デザインパターンの一つであるMediatorパターンについて話し合います。
会話の始まり: Mediatorパターンとは?
教授:Mediatorパターンは、オブジェクト間の通信を簡素化するために使われるデザインパターンです。具体的には、複数のオブジェクト間の直接的な通信を避け、代わりに「仲介者」オブジェクトを通して通信を行います。これは、オブジェクト間の結合度を下げ、変更や拡張を容易にするために有効です。
生徒:なるほど、直接通信することで起きる問題を避けるために使うんですね。
Mediatorパターンが必要な理由
教授:正解です。例えば、あるクラスが他の多くのクラスと直接通信している場合、その一つ一つの関係を管理することが非常に困難になります。しかし、Mediatorパターンを使用すると、これらの通信の管理が一箇所に集約されるため、より簡単になります。
生徒:そうすることで、コードの管理が楽になるわけですね。
使用しない場合の問題点
教授:その通りです。Mediatorパターンを使用しない場合、各オブジェクトが他の多くのオブジェクトと直接通信することになります。これは、システムの複雑さを大幅に増加させ、個々のオブジェクトの再利用が難しくなります。また、一つのオブジェクトを変更すると、その変更が連鎖的に他の多くのオブジェクトに影響を及ぼす可能性があります。
生徒:つまり、保守性や拡張性が低下するんですね。
まとめ
教授:まさにそのとおりです。Mediatorパターンは、オブジェクト間の通信を一箇所で管理することにより、システム全体の複雑さを減少させ、保守性や拡張性を向上させます。これは、大規模なアプリケーション開発において非常に価値のあるアプローチです。
生徒:ありがとうございます、Mediatorパターンの重要性がよくわかりました。
GoFの「Mediator」パターン入門

この記事では、デザインパターンの一つであるMediatorパターンについて説明し、C#での実装例を通じてその利用方法を解説します。
Mediatorパターンとは?
Mediatorパターンは、複数のオブジェクト間の通信を仲介するオブジェクトを導入することで、オブジェクト間の直接的な依存関係を減らし、結合度を下げるデザインパターンです。これにより、オブジェクト間の通信を簡素化し、各オブジェクトの再利用性を向上させます。
Mediatorパターンの実装例
以下に、MediatorパターンをC#で実装した簡単な例を示します。
using System;
using System.Collections.Generic;
// Mediatorインターフェイス
public interface IMediator {
void Send(string message, Colleague colleague);
}
// 具体的なMediator
public class ConcreteMediator : IMediator {
private List colleagues = new List();
public void Register(Colleague colleague) {
colleagues.Add(colleague);
}
public void Send(string message, Colleague colleague) {
foreach (var col in colleagues) {
if (col != colleague) {
col.HandleNotification(message);
}
}
}
}
// Colleagueクラス
public abstract class Colleague {
protected IMediator mediator;
public Colleague(IMediator mediator) {
this.mediator = mediator;
}
public abstract void HandleNotification(string message);
public void Send(string message) {
mediator.Send(message, this);
}
}
// 具体的なColleague
public class ConcreteColleague1 : Colleague {
public ConcreteColleague1(IMediator mediator) : base(mediator) {}
public override void HandleNotification(string message) {
Console.WriteLine("ConcreteColleague1がメッセージを受信: " + message);
}
}
public class ConcreteColleague2 : Colleague {
public ConcreteColleague2(IMediator mediator) : base(mediator) {}
public override void HandleNotification(string message) {
Console.WriteLine("ConcreteColleague2がメッセージを受信: " + message);
}
}
class Program {
static void Main(string[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.Register(colleague1);
mediator.Register(colleague2);
colleague1.Send("こんにちは、Colleague2");
colleague2.Send("こんにちは、Colleague1");
}
}
このコード例では、ConcreteMediatorクラスが仲介者として、ConcreteColleague1とConcreteColleague2間の通信を管理しています。
まとめ
Mediatorパターンは、大規模なアプリケーションにおいて、オブジェクト間の通信を効率化し、管理しやすくするために有効なデザインパターンです。C#での実装例を通じて、その基本的な使い方を理解できました。
Mediatorパターンが解決したこと

この記事では、Mediatorパターンの適用によってどのような問題が解決されるのか、教授と生徒の会話を通じて解説します。
導入
生徒:教授、Mediatorパターンを使うことで、具体的にどんな問題が解決できるんですか?
教授:良い質問ですね。Mediatorパターンは主に、複数のオブジェクト間の複雑な通信を整理し、各オブジェクト間の依存関係を減らすことで、システム全体の管理を容易にするのに役立ちます。
問題の特定
生徒:それはどういう時に役立つんですか?
教授:例えば、あるシステムで多くのコンポーネントが互いに直接通信している状況を想像してみてください。コンポーネントの数が増えると、それぞれの通信の管理が非常に複雑になります。これが、システムの拡張性や保守性を大幅に低下させる主な原因です。
Mediatorパターンの適応
生徒:なるほど、そういう時にMediatorパターンを使うわけですね。
教授:正確には、Mediatorパターンを適用することで、コンポーネント間の直接的な通信を仲介者オブジェクトを通じて行うように変更します。これにより、コンポーネント間の依存関係が大幅に減少し、コンポーネントの追加や変更がより柔軟に行えるようになります。
解決された問題
生徒:具体的には、どんな問題が解決されるんですか?
教授:大きく分けて二つの問題が解決されます。一つ目は、システムの複雑性が大幅に減少すること。これにより、システムの理解、拡張、保守が容易になります。二つ目は、コンポーネントの再利用性が向上することです。各コンポーネントが独立しているため、他のプロジェクトでも使用することができます。
まとめ
生徒:Mediatorパターンを使うことで、システム全体がより管理しやすく、再利用も効率的になるんですね。ありがとうございます、よく理解できました!
