php观察者模式使用场景,php设计模式系列--观察者模式

bV1Wkq?w=301&h=167

模式定义

观察者模式(observer pattern): 定义对象间的一种一对多(或一对一)的依赖关系,当被观察者状态发生改变时,注册的观察者都会被通知。

观察者模式又称 发布-订阅(publish/subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

模式动机

建立一种对象和对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象收到通知各自处理自己的业务逻辑。这里发生改变的对象称为被观察者,被通知的对象称为观察者。这些观察者之间没有关系,可以根据业务需求添加或删除观察者,便于系统维护和扩展。

模式结构

Subject(目标)

ConcreteSubject(具体目标)

Observer: 观察者

ConcreteObserver:具体观察者

UML 图

bV1WpL?w=607&h=253

代码示例

代码实现的场景: 假设有个一个商人卖东西,他的用户有穷人和富人两类,商人的商品可能会涨价也可能会降价 价格波动对穷人和富人的购买行为有不同的影响。

分析: 这里的观者目标是 商品价格 ,被观察者是穷人和富人,商品价格变化将会通知穷人和富人,穷人富人对购买做出不同的反映。

// 目标

interface Observables

{

public function attach(Observer $ob);

public function detach(Observer $ob);

public function notify();

}

// 具体目标

class Saler implements Observables

{

protected $obs = [];

protected $range = 0;

public function attach(Observer $ob)

{

$this->obs[] = $ob;

}

public function detach(Observer $ob)

{

foreach ($this->obs as $k=>$v){

if($v != $ob){

$this->obs[] = $v;

}

}

}

public function notify()

{

// $this->range 为0表示价格不变 大于0涨价 小于0降价

if($this->range != 0){

foreach ($this->obs as $ob) {

$ob->update($this);

}

}

}

public function increPrice($range)

{

$this->range = $range;

}

public function getRange()

{

return $this->range;

}

}

// 观察者

interface Observer

{

public function update(Observables $obv);

}

//具体观察者(穷人)

class PoorBuyer implements Observer{

public function update(Observables $obv)

{

if($obv->getRange()>0){

echo '穷人:涨价不买了';

}else{

echo '穷人:降价了赶紧买';

}

}

}

//具体观察者(富人)

class RichBuyer implements Observer{

public function update(Observables $obv)

{

echo '富人:价格波动没关系,继续购买
';

}

}

模式应用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用

一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

一个对象必须通知其他对象,而并不知道这些对象是谁。

需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值