PHP设计模式-观察者模式

来源:互联网 发布:angular.js介绍 编辑:程序博客网 时间:2024/05/17 02:00

概念

又名:发布-订阅模式,模型-视图模式,源-收听者模式,从属模式;一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时候主动发送通知。通常用户实现事件处理系统观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新!

应用场景

示例

<?php/** * @class PHP实现观察者模式 * PHP中实现观察者observer与被观察者subject的接口 *接口SplSubject是系统自带的接口,需要实现方式attach(SPLObserver $oberser) * SPL学习 */class user implements SplSubject{   public $lognum;   public $hobby;   protected $observer = null;   public function __construct($hobby){      $this->lognum = rand(1, 10);      $this->hobby = $hobby;      $this->observer = new SplObjectStorage();//专门用来存储对象的类   }   /**    *@function 用户登录    *    */   public function  login(){      //用户登录的时候,通知观察者,一旦行为发生变化      //根据自己      //登录出发自己的notify      $this->notify();   }   /**    *    *    */   public function attach(SPLObserver $observer) {      $this->observer->attach($observer);//将observer传进来   }   public function detach(SPLObserver $observer) {      $this->observer->detach($observer);   }   /**    *@function 当发生变化直接通知    *    */   public function notify() {      $this->observer->rewind();//存储了很多对象;      while($this->observer->valid()){         $observer = $this->observer->current();//获得一个对象,这个就是来观察我的人         $observer->update($this);//调用更新         $this->observer->next();      }   }}/** *@class 安全类需要观察用户登录 * */class security implements SplObserver{   public function update(SplSubject $subject){      if($subject->lognum < 3){         echo '这是第几次'.$subject->lognum.'次登录';      }else{         echo '这是第几次'.$subject->lognum.'次登录异常';      }   }}/* * * */class ad implements SplObserver{   public function update(SplSubject $subject){      if($subject->hobby == 'sports'){         echo '篮球比赛';      } else{         echo '好好学习';      }   }}/*实施观察*/$user = new user('sports');$user->attach(new security());//安全模块过来观察$user->attach(new ad());//广告模块过来观察$user->login();
0 0
原创粉丝点击