Observer パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Mediatorからの続き。

分散イベント処理システムの実装に主に使われる。言語によっては、このパターンで扱われる問題は言語が持つイベント処理構文で処理される。リアルタイムのアプリケーション配置の手段として興味深い機能である。

興味深いとか言われましても…

クラス図

Observer PlantUML

PHP が SPL として用意しているものを利用できるのでそれを利用することにした。SPL は探してみると色々なものが準備されていて勉強になる。

The Standard PHP Library (SPL) は、標準的な問題を解決するためのインターフェイスやクラスを集めたものです。

今回利用するのは以下 2 点。そのものズバリの名前で用意されている。ただインターフェイスなので各実装などは自分でやる(当たり前)。

自分としての理解・疑問

  • SPL に用意されているって事は良く使われるパターンなのかもな。
  • 何か状態が変わった時に、変わった側が通知するだけで処理を受け持たない。
  • 言い方を帰ると観察する形になるけど、更新通知受けるやつ登録しとけパターンって感じ。
  • SPLSubject(通知側)では attach, detach, nitfy と言うメソッド名になっているので変更した
<?php
    /**
     * Observerの登録
     *
     * @access public
     * @param object $obsever SplObserverオブジェクト
     * @return void
     */
    public function attach(\SplObserver $observer)
    {
        $this->observers[] = $observer;
    }

    /**
     * Observerの解除
     *
     * 与えられたObseverを観察者の対象から外す
     *
     * @access public
     * @param object $observer SplObseverオブジェクト
     * @return bool
     */
    public function detach(\SplObserver $observer)
    {
        $key = array_search($observer, $this->observers, true);

        if ($key) {
            unset($this->observers[$key]);
            return true;
        } else {
            throw new \OutOfRangeException('Observerが見つかりません');
            return false;
        }
    }

    /**
     * 観察者側(Observer側への通知)
     *
     * @access public
     * @param void
     * @return void
     */
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }