观察者模式
当一个对象或事件发生变化时,其他的对象实例或者事件需要跟着发生相应改动或者进行相应动作的一对多关系可进行应用。
如:订单状态变化(支付完成)后需要进行,短信通知,公众号推送等一系列相应操作时。可将订单类看成一个被观察者,短信通知类,公众号通知,app推送等相关通知类视为观察者。
具体实现和调用步骤:
分别实现 SplSubject、SplObserver类,在SplSubject实现类中实例化SplObjectStorage类进行对象的存储
将观察者对象分别加入被观察者对象进行存储
在对象发生变化后调用通知方法,逐个通知观察者对象进行相关操作
好处:
避免进行无数的判断操作,造成代码臃肿,不美观
降低耦合度
<?php header("Content-Type: text/html;charset=utf-8"); class test implements SplSubject{//被观察者类 public $_observer; public $num; public $ad; function __construct() { $this->_observer = new SplObjectStorage(); } public function run(){ $this->notify(); print_r($this); } public function attach(SplObserver $observer) { // TODO: 添加观察者对象 $this->_observer->attach($observer); } public function detach(SplObserver $observer) { // TODO: Implement detach() method. $this->_observer->detach($observer); } public function notify() { // TODO: Implement notify() method. foreach ($this->_observer as $obj){ $obj->update($this); } } } class checkNum implements SplObserver{ public function update(SplSubject $subject) { // TODO: 根据通知更新 $subject->num = "检查次数"; } } class checkAd implements SplObserver{ public function update(SplSubject $subject) { // TODO: 根据通知更新 $subject->ad = "检查广告"; } } $test = new test(); $test->attach(new checkNum()); $test->attach(new checkAd()); $test->run();
如有错误,还望大神指出