您当前的位置: 首页 >  php

知其黑、受其白

暂无认证

  • 0浏览

    0关注

    1250博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

PHP观察者模式

知其黑、受其白 发布时间:2021-04-22 21:51:54 ,浏览量:0

阅读目录
  • PHP观察者模式简单示例
  • PHP观察者模式
    • 问题
    • 解决
      • 被观察者
      • 观察者
      • 客户端
      • 新增观察者
      • 特点
      • 预览代码
    • 实例A
    • 实例B
  • PHP 观察者模式

PHP观察者模式简单示例

当一个对象发生变化时,依赖他的对象全部会收到通知,并自动更新。

# EventGenerator.php
observers[]=$observer;
	}

	function notify(){
		foreach ($this->observers as $observer){
			$observer->update();
		}
	}
}
?>

# 定义一个观察者接口 Observer.php
addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->triger();
$event->notify();
PHP观察者模式

观察者模式,也称发布-订阅模式,定义了一个被观察者和多个观察者的、一对多的对象关系。

在被观察者状态发生变化的时候,它的所有观察者都会收到通知,并自动更新。

观察者模式通常用在实时事件处理系统、组件间解耦、数据库驱动的消息队列系统,同时也是MVC设计模式中的重要组成部分。

以下我们以订单创建为例。

当订单创建后,系统会发送邮件和短信,并保存日志记录。

问题

在没有用观察者模式的时候,如下:

class Order
{
    // 订单状态
    private $state = 0;

    // 订单状态有变化时发送通知
    public function addOrder()
    {
        $this->state = 1;
        // 发送邮件
        Email::update($this->state);
        // 短信通知
        Message::update($this->state);
        // 记录日志
        Log::update();
        // 其他更多通知
    }
}

代码中,在Order类中调用各类的方法来实现通知。当在客户端创建订单:

$order = new Order();
$order->addOrder();

就会同时产生三个通知:发送邮件、发送短信和记录日志。

在系统小的时候,这是非常快捷有效的方式。

可是,当系统变大的时候,这种方法马上面临难以扩展的问题,并且容易出错:

1、如果订单不需要某种通知,比如不需要记录日志,则必须修改Order类,做状态的判断; 2、如果再加一种通知方式,如系统消息通知,则除了增加新类,同时还需要修改Order类和客户端。

这两条都不符合面向对象中的开闭原则,会让系统越来越难维护。

解决

接下来我们用观察者模式解决这个问题。

被观察者

被观察者是一些具体的实例,比如订单管理、用户登陆、评论回复、状态审核等等。

别的功能会依赖于它们的状态进行各种动作。

            
关注
打赏
1665558895
查看更多评论
0.0872s