😸
デザインパターンを学ぶ #4 Observer(オブザーバー)
1. はじめに
デザインパターン学習シリーズの第4回。今回は「Observer(オブザーバー)」パターンを取り上げます。
目的は「あるオブジェクトの状態変化を、関連するオブジェクトに自動で通知する仕組み」を理解することです。
2. Observer とは?
Observer パターンは「1つの対象(Subject)」に「複数の観察者(Observer)」を登録し、
対象に変化があったら自動で全員に通知する仕組みです。
例として「ブログ記事の更新通知」「イベントのリスナー」などがイメージしやすいです。
3. 実装例(PHP)
// Subject(通知元)
interface Subject {
public function attach(Observer $observer): void;
public function detach(Observer $observer): void;
public function notify(string $message): void;
}
class Blog implements Subject {
private array $observers = [];
public function attach(Observer $observer): void {
$this->observers[] = $observer;
}
public function detach(Observer $observer): void {
$this->observers = array_filter(
$this->observers,
fn($o) => $o !== $observer
);
}
public function notify(string $message): void {
foreach ($this->observers as $observer) {
$observer->update($message);
}
}
public function publish(string $title): void {
echo "Blog post published: {$title}\n";
$this->notify("New post: {$title}");
}
}
// Observer(通知先)
interface Observer {
public function update(string $message): void;
}
class EmailSubscriber implements Observer {
public function update(string $message): void {
echo "Email received: {$message}\n";
}
}
class SmsSubscriber implements Observer {
public function update(string $message): void {
echo "SMS received: {$message}\n";
}
}
// 利用例
$blog = new Blog();
$blog->attach(new EmailSubscriber());
$blog->attach(new SmsSubscriber());
$blog->publish("Design Patterns in PHP");
// Blog post published: Design Patterns in PHP
// Email received: New post: Design Patterns in PHP
// SMS received: New post: Design Patterns in PHP
4. メリットと注意点
メリット
- 状態変化を自動的に関連オブジェクトへ伝達できる
- 新しい通知先を追加しても Subject 側を変えなくてよい
注意点
- Observer が増えると通知コストが高くなる
- 複雑になると「誰に通知されているのか」が追いにくい
5. 実務での利用例
- Laravel の Event / Listener 機構
- GUI で「ボタンを押したら複数の処理が動く」仕組み
- メッセージ配信(メール、SMS、Push通知など)
6. まとめ
Observer パターンは「対象の変化を複数の観察者に自動で知らせる仕組み」。
イベント駆動や通知処理に役立ちます。
次回は Decorator(デコレーター)など構造に関するパターンを扱うと流れが自然です。
Discussion