Content

PHP设计模式中观察者模式详解(观察者模式代码实现)没想到

文章摘要

这篇文章介绍了使用**观察者模式**实现的订单处理系统。文章定义了一个名为`OrderListener`的类,该类通过`SplSubject`接口实现,并通过`SplObjectStorage`存储需要被观察的对象。`buyGoods`方法触发`notify`,将当前对象通知所有注册的观察者。文章还定义了两个具体的观察类`Mail`和`Sms`,它们分别在`update`方法中发送邮件和短信通知。最后,通过实例化`OrderListener`并注册这两个观察器,展示了系统的完整流程。

class OrderListener implements \SplSubject { //观察者列表 public $observers; public function __construct() { //SplObjectStorage类提供从对象到数据的映射,或者通过忽略数据,提供对象集的映射。在许多需要唯一标识对象的情况下,这种双重用途非常有用。 $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() { //将迭代器(此处可以理解为指针)倒回到第一个存储元素。 $this->observers->rewind(); //判断指针是否有效 while($this->observers->valid()) { //获取当前的观察者 $curr_obj=$this->observers->current(); //对当前观察者进行通知 $curr_obj->update($this); //向下移动指针 $this->observers->next(); } } //触发通知 public function buyGoods() { echo ‘购买成功’ . PHP_EOL; $this->notify(); } } //SplObserver接口与SplSubject接口一起使用,以实现观察者设计模式。 class Mail implements \SplObserver { //对被观察的对象做相应的处理 public function update(\SplSubject $subject) { echo ‘发送邮件’ . PHP_EOL; } } class Sms implements \SplObserver { //对被观察的对象做相应的处理 public function update(\SplSubject $subject) { echo ‘发送短信’ . PHP_EOL; } } $listener=new OrderListener(); //添加观察者 $listener->attach(new Mail()); $listener->attach(new Sms()); $listener->buyGoods();