2.19. 观察者模式(Observer)
目的
一个 主体
,被一堆 观察者监
监听。
调用 主体
,执行所有 观察者
。
例子: laravel
事件
uml
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购买了商品