[design pattern] : Observerパターン
概要
このパターンは監視するクラス/監視されるクラスから成り立ち、監視されるクラスで特定の処理が入ったときに
監視クラスにメッセージを送信することができるというもの。例えば監視されるクラスで処理が終わったときに
監視クラスに通知を行ない、監視側で処理を動かしたい時になど利用出来る。ここで重要なことは監視されるクラスは
監視クラスの状態を知る必要はなく、自身の状態を監視クラスに伝えることのみを行えばよいためクラス関係は疎結合
になる。
監視クラス
//監視を行うクラスinterface
interface Observer {
public static function update( $subject, $args );
}
//監視クラスの実装
class ObserverClass implements Observer {
public static function update( $subject, $args ) {
echo( "$subject is update . args = $args" );
}
}
監視するクラスは監視されるクラス側から呼び出される通知用のメソッドのみを用意してあげます。
監視されるクラス
//監視をされるクラスinterface
interface Subject {
public static function addObserver( Observer $observer );
}
//監視をされるクラスの実装
class TestSubject implements Subject {
private static $_observers = array();
//メソッドが呼び出される度に監視クラスに通知
public static function addCustomer( $name ) {
foreach( self::$_observers as $obs ) {
$obs::update( __CLASS__, $name );
}
}
//監視クラスの追加
public static function addObserver( Observer $observer ) {
self::$_observers[] = $observer;
}
}
監視されるクラスは監視するObserverクラスを登録するようにします。登録している監視クラス全てに対して
通知を行うようにします。ここでは監視クラスに用意したupdateメソッドを呼び出します。
client
$ts = new TestSubject();
$ts::addObserver( new ObserverClass() );
$ts::addCustomer( "TEST CODE" );
監視されるクラスをインスタンス化し、監視クラスを追加しているだけです。
出力結果
TestSubject is update . args = TEST CODE
処理結果は上のようになります。