小洪維尼 发表于 2018-12-12 14:03:27

PHP设计模式:观察者模式

  首先来看个栗子:
//事件
class EventDemo
{
    //触发了新事件
    public function trigger()
    {
      echo "Event happening\r";
      echo "后续业务更新逻辑1\r\n";
      echo "后续业务更新逻辑2\r\n";
      echo "后续业务更新逻辑3\r\n";
    }
}  场景:当事件发生变化时,触发其他业务进行相关的操作
  特征1.所有业务代码都是***式的,直接放置于核心业务当中。
  2.耦合度太高,不便于管理维护。需要一件一件事去做处理。
  

  于是我们可以这样假设:
  假如后续业务都是都是该事件的关注者,当事件发生改变,只需要通知到观察者即可。其他的工作由观察者自行完成。
  类似发布--订阅这种模式。
  代码实现:
  步骤1.定义观察者接口
  步骤2.定义观察者类
  步骤3.定义事件产生器(抽象类)
  步骤4.定义事件场景类(继承并实现事件产生器抽象类)
  步骤5.实例化运用
            实例化事件场景-->添加观察者-->通知
  

  定义观察者接口
/**
* 定义观察者接口(观察对象为事件发生者)
*Interface Observer
*/
interface Observer
{
    /**
   * 事件发生时,进行更新操作
   * @param null $eventInfo 发生事件的信息
   * @return mixed
   */
    public function update($eventInfo = null);
}  定义观察者类
//定义多个观察者
class Observer1 implements Observer
{
    public function update($eventInfo = null)
    {
      echo "观察者1:准备开始{$eventInfo} \r\n";
    }
}
class Observer2 implements Observer
{
    public function update($eventInfo = null)
    {
      echo "观察者2:准备开始{$eventInfo} \r\n";
    }
}  定义事件产生器(抽象类)
/**
* 事件产生者(抽象类)
* Class EventGenerator
*/
abstract class EventGenerator
{
    private $observers = [];//事件的所有观察者
    /**
   * 增加观察者
   * @return mixed
   */
    public function addObserver(Observer $observer)
    {
      $this->observers[] = $observer;
    }
    /**
   * 通知事件发生了,其他观察者接到通知后更新业务逻辑
   * @return mixed
   */
    public function notify($eventInfo)
    {
      foreach ($this->observers as $observer) {
            $observer->update($eventInfo);
      }
    }
}  定义事件场景类(继承并实现事件产生器抽象类)
/**
* 定义事件类(继承事件产生者类)
* Class Event
*/
class Event extends EventGenerator
{
    public function trigger($eventInfo)
    {
      echo "事件 :{$eventInfo} 即将发生,通知观察者们做好更新准备\r\n";
      $this->notify($eventInfo);
      echo "";
    }
}  主业务场景的实现
$event = new Event();
//此处可以动态添加、删除观察者
$event->addObserver(new Observer1());
//$event->addObserver(new Observer2());

//此处可以发生任意多个事件
$event->trigger('吃饭');
$event->trigger('喝水');
$event->trigger('走路');  至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。




页: [1]
查看完整版本: PHP设计模式:观察者模式