🧩 Mediator パターン
✅ 設計意図
- 各コンポーネントがMediator(調停役)を通じて通信
- 双方向の依存を 1 箇所に集約し、関係性を管理しやすくする
✅ 適用理由
- 複数の処理を制御する中心的な役割を持つクラスを作りたい場合に有効
- 各コンポーネントの独立性を保ちつつ連携が可能
✅ 向いているシーン
- 複数コンポーネントの関係を制御したい UI、フォーム、サービス間連携など
- 全体の流れや制御を見える化したいとき
✅ コード例
- TypeScript
- PHP
- Python
// 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");
<?php
interface Mediator {
public function notify(string $sender, mixed $data): void;
}
class UserService {
public function __construct(private Mediator $mediator) {}
public function registerUser(string $email): void {
echo "ユーザー登録: {$email}\n";
$this->mediator->notify("UserService", $email);
}
}
class Mailer {
public function sendWelcome(string $email): void {
echo "送信しました: {$email} → ようこそ!\n";
}
}
class AppMediator implements Mediator {
public function __construct(private Mailer $mailer) {}
public function notify(string $sender, mixed $data): void {
if ($sender === "UserService") {
$this->mailer->sendWelcome($data);
}
}
}
// 利用例
$mailer = new Mailer();
$mediator = new AppMediator($mailer);
$userService = new UserService($mediator);
$userService->registerUser("user@example.com");
from abc import ABC, abstractmethod
class Mediator(ABC):
@abstractmethod
def notify(self, sender: str, data: any):
pass
class Mailer:
def send_welcome(self, email: str):
print(f"送信しました: {email} → ようこそ!")
class AppMediator(Mediator):
def __init__(self, mailer: Mailer):
self.mailer = mailer
def notify(self, sender: str, data: any):
if sender == "UserService":
self.mailer.send_welcome(data)
class UserService:
def __init__(self, mediator: Mediator):
self.mediator = mediator
def register_user(self, email: str):
print(f"ユーザー登録: {email}")
self.mediator.notify("UserService", email)
# 利用例
mailer = Mailer()
mediator = AppMediator(mailer)
user_service = UserService(mediator)
user_service.register_user("user@example.com")
✅ 解説
このコードは Mediator
パターン を使用して、複数のコンポーネント(UserService
と Mailer
)間の直接的な依存関係を排除し、
Mediator
を介して通信する設計を実現している。Mediator
パターンは、オブジェクト間の通信を仲介者(Mediator
)に委譲することで、
オブジェクト同士の結合度を低くするデザインパターン。
1. Mediator パターンの概要
- Mediator: コンポーネント間の通信を仲介するインターフェース
- このコードでは
Mediator
が該当
- このコードでは
- ConcreteMediator:
Mediator
を実装し、具体的な通信ロジックを提供するクラス- このコードでは
AppMediator
が該当
- このコードでは
- Colleague:
Mediator
を利用して通信するコンポーネント- このコードでは
UserService
とMailer
が該当
- このコードでは
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
に集約することで、コードの可読性と保守性が向上
この設計は、複数のコンポーネントが相互に通信する必要がある場面で非常に有効であり、コードの拡張性と保守性を向上させる。