设计模式之观察者模式

模拟场景

假如当订单支付完成后,我们需要记录一下订单支付完成的日志另外还需要给用户发送一条短信告知用户支付成功,那么在这个场景下我们会用到观察者模式

思路

  1. 获取支付成功的订单相关信息
  2. 记录日志
  3. 发送短信

代码实现

<?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();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值