php 设计模式之 观察者



1. 观察者模式

定义对象一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

观察者和被观察者都是抽象耦合的

建立一套触发机制

参考链接


2. 类图

image


3. 实列

interface Observer {    // 定义观察者接口,里面有 update 方法
    public function update($obj);
}

class Message implements Observer {     // 具体的观察者
    function update($obj) {
        echo '发送新订单短信(' . $obj->mobile . ')通知给商家';
    }
}

class Goods implements Observer {   // 观察者
    public function update($obj) {
        echo '修改商品' . $obj->goodsId . '的库存';
    }
}

class Order {   // 管理观察者类
    private $observers = [];    // 观察者的集合
    public function attach($ob) {   // 添加观察者
        $this->observers[] = $ob;
    }

    public function detach($ob) {   // 删除观察者
        $position = 0;
        foreach ($this->observers as $ob) {
            if ($ob == $observer) {
                array_splice($this->observers, ($position), 1);
            }
            ++$position;
        }
    }
    public function notify($obj) {  // 通知,遍历集合间所有内容,调用update
        foreach ($this->observers as $ob) {
            $ob->update($obj);
        }
    }
    public function sale() {    // 执行类
        $obj = new stdClass();
        $obj->mobile = '13888888888';
        $obj->goodsId = 'Order11111111';
        $this->notify($obj);    // 通知所有观察者,发送短信,修改库存
    }
}

$message = new Message();
$goods = new Goods();
$order = new Order();

$order->attach($message);
$order->attach($goods);

$order->sale();

3. 应用场景

  1. 商品库存发生变化后,库存通知,短信通知
  2. php 的 spl 扩展
posted @ 2020-12-29 12:15  linsonga  阅读(54)  评论(0)    收藏  举报