Observerパターンについて考える
Observerパターン、名前は知ってるけど、いまいち使いどころがよく分かりませんでした。
「状態の変化を通知する仕組み」とのことですが、あまりそういう状況に出くわさないというか、頭にピンとこないというか…。
調べてみたんですが、おそらく自分は勘違いしてました。
これ、別に通知とか関係ないのでは。
結局のところ、
<?php $objects = [ new ObjectA(), new ObjectB(), new ObjectC() ]; foreach ($objects as $object) { $object->commonMethod(); }
上記のように、「同名のメソッドを持つなら、ループできるよ」というだけのように思います。
<?php interface Object { public function commonMethod(); }
インターフェースを作って、共通のメソッドを持たせます。
そしてもう一点、「状態変化をどのObserverに通知するか(共通メソッドをどのオブジェクトに実行させるか)」ですが、新人の頃の自分なら、わざわざフラグ用の変数を作っていたように思います。
<?php $objectA->isObserving = true; $objectB->isObserving = false; $objectC->isObserving = true; $objects = [$objectA, $objectB, $objectC]; foreach ($objects as $object) { if ($object->isObserving) { $object->commonMethod(); } }
でもそうじゃなく、Subject(メインルーチン)にObserver(メソッドを実行させるオブジェクト)を配列で持たせてやれば、それでいいんですよね。
<?php $subject->observerList = [ $ObjectA, $ObjectC ]; foreach ($subject->observerList as $object) { $object->commonMethod(); }
フラグ用の変数を作るのは、今後控えようと思います。フラグを立てたいオブジェクトを配列に持たせてやれば、それでよい!