PHP设计模式-观察者 发表于 2017-04-05 | 分类于 PHP | 评论数: | 阅读次数: 本文字数: 2.5k | 阅读时长 ≈ 2 分钟 适用性 观察者观察被观察者,被观察者通知观察者 代码示例 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146/** * 观察者接口 */interface ObserverInterface{ /** * 行为 * @return void */ public function doSomething(ObservableInterface $observable);}/** * 观察者实体类示例1 */class ObserverExampleOne implements ObserverInterface{ /** * 行为 * @return mixed */ public function doSomething(ObservableInterface $observable) { echo $observable->_name . "通知了观察者1 \n"; }}/** * 观察者实体类示例2 */class ObserverExampleTwo implements ObserverInterface{ /** * 行为 * @return mixed */ public function doSomething(ObservableInterface $observable) { echo $observable->_name . "通知了观察者2 \n"; }}/** * 被观察者接口 * * 需要实现附加观察者,删除观察者,通知观察者方法 */interface ObservableInterface{ /** * 附加观察者 * @return void */ public function attach(ObserverInterface $observer); /** * 解除观察者 * @return void */ public function detach(ObserverInterface $observer); /** * 通知观察者 * @return void */ public function notify();}/** * 被观察者实体类 * * 实现附加观察者,删除观察者,通知观察者方法 */class Observable implements ObservableInterface{ /** * 观察者们 * @var array */ private $_observers = []; /** * 被观察者名称 * @var string */ private $_name = '【被观察者:皮皮虾】'; /** * 魔术方法 __get * @param string $name 属性名称 * @return mixed */ public function __get($name='') { return $this->$name; } /** * 附加观察者 * @return void */ public function attach(ObserverInterface $observer) { if (!in_array($observer, $this->_observers, true)) { $this->_observers[] = $observer; } } /** * 解除观察者 * @return void */ public function detach(ObserverInterface $observer) { foreach ($this->_observers as $k => $v) { if ($v === $observer) { unset($this->_observers[$k]); } } } /** * 通知观察者 * @return void */ public function notify() { foreach ($this->_observers as $v) { $v->doSomething($this); } }}// 注册一个被观察者对象$observable = new Observable();// 注册观察者们$observerExampleOne = new ObserverExampleOne();$observerExampleTwo = new ObserverExampleTwo();// 附加观察者$observable->attach($observerExampleOne);$observable->attach($observerExampleTwo);// 被观察者通知观察者们$observable->notify();