• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP面向对象进阶设计模式:观察者模式使用实例

php 搞代码 3年前 (2022-01-22) 25次浏览 已收录 0个评论

什么是观察者模式?

观察者设计模式能够更便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能性。

该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。


UML

该图详细说明了一个使用观察者设计模式的类设计:

下面是对上图的说明:

1.MyObject是可观察对象,它包含一个名为observers的观察者保护数组。公共方法addObserver()接受一个观察者的实例并将其存储在观察者数组内。

2.doSomething()公共方法会被调用,这个方法对MyObject应用状态变化。随后,notify()公共方法会被调用,这个方法可遍历循环观察者数组。

3.MyObjectObserver具有一个名为change()的公共方法,该方法接受MyObject的一个实例。这个特定的观察者接下来会对MyObject的内容执行某些操作。当在观察者数组中找到特定的观察者时,MyObject的notify()方法会直接调用change()方法。

使用实例:

<?php  interface Observable{      function attach( Observer $observer );      function detach( Observer $observer );      function notify();  }      class login implements Observable{      const LOGIN_USER_UNKNOW = 1;      const LOGIN_WRONG_PASS = 2;      const LOGIN_ACCESS = 3;      private $status = array();      private $observers = array();        public function setStatus( $status, $user, $ip ) {          $this->status = array( $status, $user, $ip );      }      public function getStatus() {          return $this->status;      }      public function handleLogin( $user, $pass, $ip ) {          switch ( mt_rand( 1, 3 ) ) {          case 1:              $this->setStatus( self::LOGIN_USER_UNKNOW, $user, $ip );              $ret = false;              break;          case 2:              $this->setStatus( self::LOGIN_WRONG_PASS, $user, $ip );              $ret = false;              break;          case 3:              $this->setStatus( self::LOGIN_ACCESS, $user, $ip );              $ret = true;              break;          }          $this->notify();          return $ret;      }          public function attach( Observer $observer ) {          $this->observers[] = $observer;      }        public function detach( Observer $observer ) {          $newObservers = array();          foreach ( $this->observers as $obs ) {              if ( $obs !== $observer )                  $newObservers[] = $obs;          }          $this->observers = $newObservers;      }        public function notify() {          foreach ( $this->observers as $obs ) {              $obs->update( $this );          }      }  }    interface Observer{      function update( Observable $observable );  }    class SecurityMonitor implements Observer{      function update( Observable $observable ) {          $status = $observable->getStatus();          if($status[0] == Login::LOGIN_WRONG_PASS){              echo __CLASS__.":".$status[1]."于".$status[2]."登录失败";          }      }  }    $login = new Login();  $login->attach(new SecurityMonitor());  $login->handleLogin('XXX','XXX','127.0.0.1');  ?> <strong>)本文来(源gaodai#ma#com搞@@代~&码*网2</strong><pre>搞代gaodaima码

出错时的运行结果: SecurityMonitor:XXX于127.0.0.1登录失败[Finished in 0.1s]

代码中可以看到login对象主动添加SecurityMonitor对象观察。这样要调用Login::getStatus(),SecurityMonitor类就必须了解更多信息。虽然调用发生于一个ObServable对象上,但无法保证对象也是一个Login对象。为解决这个问题,有一个办法:断续保持ObServable接口的通用性,由ObServer类负责保证它们的主体是正确的类型。它们甚至能将自己添加到主体上。

以上就是PHP面向对象进阶设计模式:观察者模式使用实例的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP面向对象进阶设计模式:观察者模式使用实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址