2.19. 观察者模式(Observer)

未匹配的标注

目的

一个 主体 ,被一堆 观察者监 监听。
调用 主体,执行所有 观察者

例子: laravel 事件

uml

观察者模式(Observer)

php内置类

SplSubject : 定义主体的接口
SplObjectStorage : 存储类, 可用于存储观察者, 这个类实现很多功能
SplObserver : 定义观察者接口 (就是一个update方法而已)

任务

订单支付成功( 主体 ) ,更改订单状态( 观察者 ) 和 发送短信通知 ( 观察者 )。

(大部分php内置类都定义好了,只要实现就可以了)

代码实现


<?php

class OrderPayEvent implements  \SplSubject
{

    private $observers;
    public $order;
    public function __construct(Order $order)
    {
        $this->order = $order;
        $this->observers = new \SplObjectStorage();
    }

    public function attach(\SplObserver $observer) //加入观察者
    {
        $this->observers->attach($observer);
    }

    public function detach(\SplObserver $observer)
    {
        $this->observers->detach($observer);
    }

    public function notify() //通知所有观察者  也就是执行所有观察者
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

}

class UpdateOrderStatus implements \SplObserver{
    public function update(SplSubject $subject)
    {
        $subject->order->status = 'success';
        echo "订单状态更改成功".PHP_EOL;
    }
}

class SmsNotify implements  \SplObserver {
    public function update(SplSubject $subject)
    {
        echo "发送短信:". $subject->order->user_id.'购买了商品'.PHP_EOL;
    }
}

class Order
{
    public $status = 'fail';
    public $user_id = '1';
}

$order = new Order();

$event = new OrderPayEvent($order);
$event->attach(new UpdateOrderStatus());
$event->attach(new SmsNotify());
$event->notify();

结果

订单状态更改成功
发送短信:1购买了商品

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~