当前位置: 首页 > 后端技术 > PHP

PHP设计模式系列——观察者模式

时间:2023-03-30 00:52:28 PHP

模式定义观察者模式(observerpattern):定义对象之间一对多(或一对一)的依赖关系,当被观察对象的状态发生变化时,注册将通知观察员。观察者模式也称为发布-订阅(publish/subscribe)模式、模型-视图(Model/View)模式、源-监听(Source/Listener)模式或从属(Dependents)模式。当一个对象发生变化时,它会自动通知其他对象,其他对象收到通知后会处理自己的业务逻辑。这里发生变化的对象称为观察者,被通知的对象称为观察者。这些观察者之间没有任何关系,可以根据业务需要增加或删除观察者,方便系统的维护和扩展。模式结构Subject(目标)ConcreteSubject(具体目标)Observer:观察者ConcreteObserver:具体观察者UML图代码示例代码实现场景:假设有一个卖东西的商人,他的用户有穷有富。商品价格可能上涨或下跌。价格波动对穷人和富人的购买行为有不同的影响。分析:这里观察者的目标是商品价格,观察者是穷人和富人。商品价格的变化会通知穷人和富人,而穷人和富人对购买的反应也会不同。//目标接口Observables{publicfunctionattach(Observer$ob);公共函数分离(观察者$ob);publicfunctionnotify();}//具体目标类SalerimplementsObservables{protected$obs=[];受保护的$range=0;publicfunctionattach(Observer$ob){$this->obs[]=$ob;}publicfunctiondetach(Observer$ob){foreach($this->obsas$k=>$v){if($v!=$ob){$this->obs[]=$v;}}}publicfunctionnotify(){//$this->range为0,表示价格不变,大于0,价格低于0,if($this->range!=0){foreach($this->obsas$ob){$ob->更新($this);}}}publicfunctionincrePrice($range){$this->range=$range;}publicfunctiongetRange(){return$this->range;}}//观察者接口Observer{publicfunctionupdate(Observables$obv);}//特定观察者(差)classPoorBuyerimplementsObserver{publicfunctionupdate(Observables$obv){if($obv->getRange()>0){echo'穷人:如果价格上涨就不要买
';}else{echo'穷人:降价立即购买
';}}}//具体观察者(rich)类RichBuyer实现Observer{publicfunctionupdate(Observables$obv){echo'Rich:价格波动没关系,继续买
';}}模式应用场景抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中允许它们被独立地改变和重用。一个对象的变化会引起另外一个或多个对象也发生变化,而不知道到底有多少对象会发生变化,这样可以降低对象之间的耦合度。一个对象必须在不知道这些对象是谁的情况下通知其他对象。有必要在系统中创建一个触发链。对象A的行为会影响对象B,对象B的行为会影响对象C……可以使用观察者模式创建链式触发机制。