Skip to content

メディエーターパターン

公開日:November 17, 2024更新日:November 28, 2024
TypeScriptDesign pattern📄

メディエーターパターン

メディエーターパターン(Mediator Pattern) は、複数のオブジェクト間の通信を仲介するオブジェクト(メディエーター)を導入することで、オブジェクト間の相互依存を減らし、疎結合を実現するデザインパターンです。このパターンでは、複数のオブジェクトが直接やり取りするのではなく、メディエーターを介して相互作用します。

メディエーターパターンは、複数のオブジェクト間で複雑な通信が必要な場合や、オブジェクト同士の依存関係を減らして保守性を向上させたい場合に有効です。

TypeScriptでのメディエーターパターンの実装

以下に、TypeScriptでメディエーターパターンを実装する例を紹介します。この例では、チャットルームで複数のユーザーがメッセージを送受信するシナリオを示します。

チャットルームの例

typescript
// メディエーターインターフェース
interface Mediator {
  sendMessage(message: string, user: User): void;
  addUser(user: User): void;
}

// 具体的なメディエータークラス(チャットルーム)
class ChatRoom implements Mediator {
  private users: User[] = [];

  addUser(user: User): void {
    this.users.push(user);
  }

  sendMessage(message: string, sender: User): void {
    for (const user of this.users) {
      if (user !== sender) {
        user.receive(message, sender.getName());
      }
    }
  }
}

// ユーザークラス
class User {
  private name: string;
  private mediator: Mediator;

  constructor(name: string, mediator: Mediator) {
    this.name = name;
    this.mediator = mediator;
    mediator.addUser(this);
  }

  getName(): string {
    return this.name;
  }

  send(message: string): void {
    console.log(`${this.name} sends: ${message}`);
    this.mediator.sendMessage(message, this);
  }

  receive(message: string, senderName: string): void {
    console.log(`${this.name} receives message from ${senderName}: ${message}`);
  }
}

// 実際の使用例
const chatRoom = new ChatRoom();

const user1 = new User('Alice', chatRoom);
const user2 = new User('Bob', chatRoom);
const user3 = new User('Charlie', chatRoom);

user1.send('Hello, everyone!');
user2.send('Hi Alice!');
user3.send('Hey folks, what's up?');

解説

  1. Mediatorインターフェース

    • Mediatorインターフェースは、ユーザー間でメッセージを送信するためのsendMessageメソッドと、ユーザーを追加するためのaddUserメソッドを定義しています。
  2. ChatRoomクラス(具体的なメディエーター)

    • ChatRoomクラスは、メディエーターの具体的な実装であり、複数のユーザー間でメッセージを仲介する役割を持ちます。addUserメソッドでユーザーをチャットルームに追加し、sendMessageメソッドでメッセージを他のユーザーに送信します。
  3. Userクラス(コレクリーグ)

    • Userクラスは、チャットルームに参加するユーザーを表します。各ユーザーは、sendメソッドでメッセージを送信し、receiveメソッドで他のユーザーからメッセージを受信します。ユーザーはメディエーターを介してのみ他のユーザーと通信します。
  4. 実際の使用例

    • ChatRoomインスタンスを作成し、複数のユーザー(AliceBobCharlie)をチャットルームに参加させます。それぞれのユーザーがメッセージを送信すると、他のユーザー全員にメッセージが配信されます。

利点

  • 疎結合の実現: オブジェクト同士が直接依存せず、メディエーターを介して通信するため、各オブジェクトの依存関係を減らすことができます。
  • 拡張性の向上: メディエーターを利用することで、新しいオブジェクトを追加する際に既存のオブジェクトを変更する必要がなくなり、システムの拡張が容易になります。
  • 集中管理: メディエーターが通信の仲介を担当するため、複数のオブジェクト間の通信ロジックを集中管理できます。

使用例

  • チャットシステム: 複数のユーザー間でメッセージをやり取りするチャットルームで使用されます。
  • GUIコンポーネントの連携: GUIアプリケーションで、複数のコンポーネントが連携して動作する場合、メディエーターを使用してコンポーネント間の通信を仲介します。
  • ワークフロー管理システム: 複数のタスクやプロセスが連携する場合に、メディエーターを介してタスク間の調整を行うことができます。

まとめ

メディエーターパターンは、複数のオブジェクト間の通信を仲介することで、オブジェクト間の依存関係を減らし、疎結合を実現するデザインパターンです。TypeScriptでの実装を通じて、オブジェクト同士の相互作用をメディエーターに委譲することで、システムの保守性と拡張性を向上させる方法を理解することができました。

このパターンを利用することで、複数のオブジェクト間での通信を効率的に管理し、システム全体の構造をシンプルに保つことが可能です。