观察者模式

2021-12-12  本文已影响0人  星月落

内容来源(公众号:PHP版WEB项目)当对象间存在一对多关系时,可以使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,会自动通知它的依赖对象。观察者模式属于行为型模式。

观察者模式为你提供了避免组件之间紧密耦合的另一种方法。一个对象通过添加一个方法(该方法允许另一个对象(观察者)注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者,这些观察者使用该信息执行的操作与可观察的对象无关,结果是对象可以相互对话,而不必了解原因。我们通常在主体中定义一个数组,用于存储观察者对象。

下面的代码演示当添加一个用户时如何实现消息推送。

   <?php

  //观察者

  interface IObserver

  {

   function onChanged( $sender,$args );

  }

  //定义可以被观察的对象接口

  interface IObservable

  {

   function addObserver( $observer );

  }

  class UserList implements IObservable

  {

   //数组存放观察者对象

   private $_observers = array();

   public function addCustomer( $name )

   {

              foreach( $this->_observers as $obs )

     $obs->onChanged( $this,$name ); // 通知观察者

   }

   public function addObserver( $observer )

   {

    $this->_observers []= $observer;

   }

  }

  class UserListLogger implements IObserver

  {

   //观察者执行操作

   public function onChanged( $sender,$args )

   {

    echo( "'$args' added to user list\n" );

   }

  }

  //添加第一个观察者

  $ul1 = new UserList();

  $ul1->addObserver( new UserListLogger() );

  $ul1->addCustomer( "Jack" );

  //添加第二个观察者

  $ul2 = new UserList();

  $ul2->addObserver( new UserListLogger() );

  $ul2->addCustomer("Tom");

  ?>

执行以上代码,在浏览器中的打印结果为:

   'Jack' added to user list 'Tom' added to user list

在一个抽象模型中,一个对象需要通知其他对象又不能假定其他对象是谁时,经常使用观察者模式。比如要实现用户注册后发送邮件通知管理员和用户自己填写的邮箱的功能,我们可以将发送邮件给管理员和用户自己都写在这个实现用户注册的类里,但是为了实现松散耦合,我们可以将这个发送邮件的功能单独拿出来写到另外一个类中(使用观察者实现),这样即使在以后更改了用户注册逻辑也不会影响到发送邮件的功能实现。再比如当用户下单购买一件商品时,需要将购买记录写入文本日志、数据库日志,还要发送短信、送抵兑换券积分等,我们可以在主体类中实现下单购买的流程并定义一个观察者接口,当用户下单后通知各个观察者对象执行自己的业务逻辑。

上一篇下一篇

猜你喜欢

热点阅读