😸

デザインパターンを学ぶ #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