当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP观察者模式实例分析【对比JS观察者模式】

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-23 10:24:00 浏览: 评论:0 

这篇文章主要介绍了PHP观察者模式,结合实例形式对比分析JS观察者模式实现方法,给出了php观察者模式的完整定义与使用操作示例,需要的朋友可以参考下。

本文实例讲述了PHP观察者模式,分享给大家供大家参考,具体如下:

1.用js实现观察者模式

  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4.     <title></title> 
  5.     <style type="text/css"
  6.     div{width: 100px;height: 100px;border: 1px #999 solid;margin-bottom: 5px;} 
  7.     </style> 
  8. </head> 
  9. <body> 
  10. <!-- 
  11. 我们让div对象观察select的变化,selecte变化就会通知这个2个对象,并引起这2个对象的变化,实现观察者模式。 
  12.  --> 
  13.  <h1>用观察者模式切换页面风格</h1> 
  14.  <select> 
  15.      <option value="male">男式风格</option> 
  16.      <option value="female">女士风格</option> 
  17.  </select> 
  18.  <button onclick="t1()">观察学习区</button> 
  19.  <button onclick="t2()">不观察学习区</button> 
  20.  <div id="content">我是内容</div> 
  21.  <div id="ad">我是广告</div> 
  22.  <div id="study">学习</div> 
  23. </body> 
  24. <script type="text/javascript"
  25.     var sel = document.getElementsByTagName('select')[0]; 
  26.     sel.observers = {}; 
  27.     sel.attach = function(key,obj){ 
  28.         this.observers[key] = obj; 
  29.     } 
  30.     sel.detach = function(key){ 
  31.         delete this.observers[key]; 
  32.     } 
  33.     sel.onchange = sel.notify = function(){ 
  34.         for(var key in this.observers){ 
  35.             this.observers[key].update(this); 
  36.         } 
  37.     } 
  38.     //客户端 
  39.     var content = document.getElementById('content'); 
  40.     var ad = document.getElementById('ad'); 
  41.     content.update = function(ob){ 
  42.         if (ob.value == 'male') { 
  43.             this.style.backgroundColor = 'gray'
  44.         }else if(ob.value == 'female'){ 
  45.             this.style.backgroundColor = 'pink'
  46.         } 
  47.     } 
  48.     ad.update = function(ob){ 
  49.         if (ob.value == 'male') { 
  50.             this.innerHTML = '汽车'
  51.         }else if(ob.value == 'female'){ 
  52.             this.innerHTML = '减肥'
  53.         } 
  54.     } 
  55.     //让content观察select的变化 
  56.     sel.attach('content',content); 
  57.     sel.attach('ad',ad); 
  58.     //新增监听study区 
  59.     var study = document.getElementById('study'); 
  60.     study.update = function(ob){ 
  61.         if (ob.value == 'male') { 
  62.             this.innerHTML = '学习计算机'
  63.         }else if(ob.value == 'female'){ 
  64.             this.innerHTML = '学习美容'
  65.         } 
  66.     } 
  67.     sel.attach('study',study); 
  68.     function t1(){ 
  69.         sel.attach('study',study); 
  70.     } 
  71.     function t2(){ 
  72.         sel.detach('study'); 
  73.     } 
  74. </script> 
  75. </html> 

2.用php实现观察模式

  1. <?php 
  2. //php实现观察者 
  3. //php5中提供观察者observer和被观察者subject的接口 
  4. class User implements SplSubject 
  5.     public $lognum
  6.     public $hobby
  7.     protected $observers = null; 
  8.     public function __construct($hobby
  9.     { 
  10.         $this->lognum = rand(1,10); 
  11.         $this->hobby = $hobby
  12.         $this->observers = new SplObjectStorage(); 
  13.     } 
  14.     public function login() 
  15.     { 
  16.         //操作session等 
  17.         $this->notify(); 
  18.     } 
  19.     public function attach(SPLObserver $observer
  20.     { 
  21.         $this->observers->attach($observer); 
  22.     } 
  23.     public function detach(SPLObserver $observer
  24.     { 
  25.         $this->observers->detach($observer); 
  26.     } 
  27.     public function notify() 
  28.     { 
  29.         $this->observers->rewind(); 
  30.         while ($this->observers->valid()) { 
  31.             $observer = $this->observers->current(); 
  32.             $observer->update($this); 
  33.             $this->observers->next(); 
  34.         } 
  35.     } 
  36. //用户安全登录模块 
  37. class Safe implements SPLObserver 
  38.     public function update(SplSubject $subject
  39.     { 
  40.         if ($subject->lognum < 3) { 
  41.             echo '这是第' . $subject->lognum . '次安全登录<br>'
  42.         }else
  43.             echo '这是第' . $subject->lognum . '次登录,异常<br>'
  44.         } 
  45.     } 
  46. //广告模块 
  47. class Ad implements SPLObserver 
  48.     public function update(SplSubject $subject
  49.     { 
  50.         if ($subject->hobby == 'sports') { 
  51.             echo '英超开始啦<br>'
  52.         }else
  53.             echo '好好学习<br>'
  54.         } 
  55.     } 
  56. //实施观察 
  57. // $user = new User('sports'); 
  58. $user = new User('study'); 
  59. $user->attach(new Safe()); 
  60. $user->attach(new Ad()); 
  61. $user->login();//登录

Tags: PHP观察者模式 JS观察者模式

分享到: