模拟场景
假如当订单支付完成后,我们需要记录一下订单支付完成的日志另外还需要给用户发送一条短信告知用户支付成功,那么在这个场景下我们会用到观察者模式
思路
- 获取支付成功的订单相关信息
- 记录日志
- 发送短信
代码实现
<?php
// 观察者接口
interface InterfaceObserver
{
public function onListen($sender, $args);
public function getObserverName();
}
// 被观察者接口
interface InterfaceObservable
{
public function addObserver($observer);
public function removeObserver($observerName);
}
class orderService implements InterfaceObservable
{
protected $observers;
// 添加观察者
public function addObserver($observer)
{
if ($observer instanceof InterfaceObserver) {
$this->observers[] = $observer;
}
}
// 移除观察者
public function removeObserver($observerName)
{
}
// 执行观察者
protected function renderObserver($args = null)
{
foreach($this->_observers as $observer) {
$observer->onListen($this, $args);
}
}
// 订单支付成功
public function onPament()
{
// 获取支付成的订单数据 伪代码
$data = [
'sn' => 'sn2021071500001',
'title' => 'xxx乌龙茶',
'amount' => 50,
'quantity' => 1,
'user_info' => [
'name' => 'xxx',
'mobile_phone' => '158xxxxxxxx',
]
];
// 执行观察者
$this->renderObserver($data);
}
}
// 发送支付成功短信
class SendPaymentSMSService implements InterfaceObserver
{
// 监听观察者
public function onListen($sender, $args)
{
// 发送支付成功信息的伪代码
echo "========== 发送支付成功短信通知 =============\n";
echo "您的订单支付成功 商品名称:{$args['title']} 支付金额:{$args['amount']}元\n";
}
// 获取观察者
public function getObserverName()
{
}
}
// 支付日志
class PaymentLogService implements InterfaceObserver
{
// 模拟记录支付成功日志
public function onListen($sender, $args)
{
// 记录支付成日志的伪代码
echo "========== 记录支付日志 =============\n";
echo "订单:{$args['sn']}, 支付成功\n";
}
// 获取观察者
public function getObserverName()
{
}
}
// 支付成功的逻辑
$orderService = new orderService();
$orderService->addObserver(new PaymentLogService()); // 记录支付成功日志
$orderService->addObserver(new SendPaymentSMSService()); // 发送短信通知
$orderService->onPament();