メインコンテンツまでスキップ

🧩 Mediator パターン

✅ 設計意図

  • 各コンポーネントがMediator(調停役)を通じて通信
  • 双方向の依存を 1 箇所に集約し、関係性を管理しやすくする

✅ 適用理由

  • 複数の処理を制御する中心的な役割を持つクラスを作りたい場合に有効
  • 各コンポーネントの独立性を保ちつつ連携が可能

✅ 向いているシーン

  • 複数コンポーネントの関係を制御したい UI、フォーム、サービス間連携など
  • 全体の流れや制御を見える化したいとき

✅ コード例

// Mediator インターフェース
interface Mediator {
notify(sender: string, data: any): void;
}

// コンポーネント(UserService)
class UserService {
constructor(private mediator: Mediator) {}

registerUser(email: string): void {
console.log(`ユーザー登録: ${email}`);
this.mediator.notify("UserService", email);
}
}

// コンポーネント(Mailer)
class Mailer {
sendWelcome(email: string): void {
console.log(`送信しました: ${email} → ようこそ!`);
}
}

// Mediator 実装
class AppMediator implements Mediator {
constructor(private mailer: Mailer) {}

notify(sender: string, data: any): void {
if (sender === "UserService") {
this.mailer.sendWelcome(data);
}
}
}

// 利用例
const mailer = new Mailer();
const mediator = new AppMediator(mailer);
const userService = new UserService(mediator);

userService.registerUser("user@example.com");

✅ 解説

このコードは Mediator パターン を使用して、複数のコンポーネント(UserServiceMailer)間の直接的な依存関係を排除し、 Mediator を介して通信する設計を実現している。Mediator パターンは、オブジェクト間の通信を仲介者(Mediator)に委譲することで、 オブジェクト同士の結合度を低くするデザインパターン。

1. Mediator パターンの概要

  • Mediator: コンポーネント間の通信を仲介するインターフェース
    • このコードでは Mediator が該当
  • ConcreteMediator: Mediator を実装し、具体的な通信ロジックを提供するクラス
    • このコードでは AppMediator が該当
  • Colleague: Mediator を利用して通信するコンポーネント
    • このコードでは UserServiceMailer が該当

2. 主なクラスとその役割

  • Mediator
    • コンポーネント間の通信を仲介するインターフェース
    • notify(sender: string, data: any): void メソッドを定義
  • AppMediator
    • Mediator の具体的な実装
    • notify メソッドで、送信元(UserService)からの通知を受け取り、適切なコンポーネント(Mailer)に処理を委譲
  • UserService
    • Colleague の 1 つ
    • ユーザー登録処理を行い、Mediator を介して他のコンポーネントに通知
  • Mailer
    • Colleague の 1 つ
    • Mediator からの通知を受け取り、メール送信処理を実行

3. UML クラス図

4. Mediator パターンの利点

  • 疎結合: コンポーネント間の直接的な依存関係を排除し、Mediator を介して通信することで結合度を低減
  • 拡張性: 新しいコンポーネントを追加する場合も、Mediator に処理を追加するだけで対応可能
  • 集中管理: 通信ロジックを Mediator に集約することで、コードの可読性と保守性が向上

この設計は、複数のコンポーネントが相互に通信する必要がある場面で非常に有効であり、コードの拡張性と保守性を向上させる。