浅谈设计模式之观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式。
应用场景:当我们在亚马逊下一个订单,这时候我们的邮箱会收到一封邮件,商家的邮箱也有收到一封邮件,我们的代码会如下:
class Order{
public function register(){
//TO-DO 下订单
echo "下订单完成";
//订单完成之后操作
echo "给用户发邮件";
echo "给商户发邮件";
//TO-DO 其他事
}
}
当我们的业务慢慢的变复杂。可能里面会有许多许多逻辑代码,然而每一次增加功能,都需对原来代码进行修改,并且每一个功能点之间耦合度太高。
用观察者模式重构我们之前的代码:
-
编写事件基类(主要2个方法:增加观察者方法;事件通知方法)
//事件产生者 abstract class EventGenerator{ //保存观察者数组(子类无需知道观察者因此是private) private $observers = []; //增加观察者 function addObserver(Observer $observer){ $this->observers[] = $observer; } //事件通知 function notiy(){ foreach ($this->observers as $item){ $item->update(); } } }
- 编写观察者接口
interface Observer{ //逻辑代码实现 function update($evect_info = null); }
- 实现观察者逻辑接口
//逻辑1 class Observer1 implements \Lib\Observer{ function update($evect_info = null) { echo "给用户发邮件"; } } //逻辑2 class Observer2 implements \Lib\Observer{ function update($evect_info = null){ echo "给商户发邮件"; } }
- 在主方法中调用
class Order extends \Lib\EventGenerator { function trigger(){ echo "下单成功"; //调用该事件的通知观察者方法 $this->notiy(); } } $event = new Event(); //随意增加(删除)观察者 $event->addObserver(new \Lib\Observer1()); $event->addObserver(new \Lib\Observer2()); $event->trigger();
总结:这样就实现了各个逻辑代码之间的解耦。
本作品采用《CC 协议》,转载必须注明作者和本文链接