加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_潮州站长网 (http://www.0768zz.com/)- 物联安全、建站、操作系统、云计算、数据迁移!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入畅聊PHP中的观察者模式

发布时间:2022-07-12 13:27:33 所属栏目:PHP教程 来源:互联网
导读:观察者,貌似在很多科幻作品中都会有这个角色的出现。比如我很喜欢的一部美剧《危机边缘》,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事。但是,设计模式中的观察者可不只是站在边上看哦,这里的观察者是针对主体发生的状态改变来做出对应的
  观察者,貌似在很多科幻作品中都会有这个角色的出现。比如我很喜欢的一部美剧《危机边缘》,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事。但是,设计模式中的观察者可不只是站在边上看哦,这里的观察者是针对主体发生的状态改变来做出对应的动作。
 
  Gof类图及解释
  GoF定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
 
  GoF类图:
 
  1.jpg
 
  代码实现
 
  
  interface Observer
 
  {
 
      public function update(Subject $subject): void;
 
  }
 
  观察者的抽象接口,没啥可说的吧,就是让你实现一个具体的Update就可以了
 
  
  class ConcreteObserver implements Observer
 
  {
 
      private $observerState = '';
 
      function update(Subject $subject): void
 
      {
 
          $this->observerState = $subject->getState();
 
          echo '执行观察者操作!当前状态:' . $this->observerState;
 
      }
 
  }
 
  具体的观察者,实现update()方法,这里我们拿到了Subject类,从而可以获得其中的状态
 
  
 
  class Subject
 
  {
 
      private $observers = [];
 
      private $stateNow = '';
 
      public function attach(Observer $observer): void
 
      {
 
          array_push($this->observers, $observer);
 
      }
 
      public function detach(Observer $observer): void
 
      {
 
          $position = 0;
 
          foreach ($this->observers as $ob) {
 
              if ($ob == $observer) {
 
                  array_splice($this->observers, ($position), 1);
 
              }
 
              ++$position;
 
          }
 
      }
 
      public function notify(): void
 
      {
 
          foreach ($this->observers as $ob) {
 
              $ob->update($this);
 
          }
 
      }
 
  }
 
  Subject父类,维护一个观察者数组,然后有添加、删除以及循环遍历这个数组的方法,目的是能够方便的管理所有的观察者
 
  
 
  class ConcreteSubject extends Subject{
 
      public function setState($state)
 
      {
 
          $this->stateNow = $state;
 
          $this->notify();
 
      }
 
   
 
      public function getState()
 
      {
 
          return $this->stateNow;
 
      }
 
  }
 
  Subject的实现类,只是更新了状态,在这个状态发生改变的时候,调用观察者遍历的方法进行所有观察的update()操作
 
  观察者,其实就是自身做了一个更新(update),而Subject,可以批量的执行观察者,请注意,我们不需要去修改目标类中的任何代码,只需要从外部添加就可以了,所以就让目标和观察者解耦互相之间不用关心对方的情况了
  观察者可以记录目标的状态,也可以不用记录,比如我们发完短信后的数据库更新或者插入操作,只有短信接口发送成功后我们再修改短信数据的状态就可以了,不一定完全需要将目标的发送状态传送给观察者
  当一个类在发生改变时,不知道可能会对其他多少类产生影响,这个时候观察者非常有用
  观察者模式中还是存在着耦合,那就是目标类中有一个观察者对象列表,如果观察者没有实现update()方法,那么就会出现问题
  接着拿我们的手机工厂说事儿,这次好嘛,被一帮山寨机盯上了(观察者),我出什么功能(状态更新),他们就对应的出一样的功能(更新),而且还在我的基础上做了更多的东西,美其名曰:微创新!你说气人不气人。好吧,我也派出了一帮市场调查人员(观察者),去帮我观察别人家的手机都出了什么功能(状态更新),然后我们也照搬过来搞点微创新,大家共同进步嘛!!

(编辑:我爱制作网_潮州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读