设计模式-观察者模式

 在研究这个模式之前,我们要尽可能的知道面向对象编程的概念,充分了解"对象"的在程序中的含义。
        "对象" 是一个有自己的属性、方法的整体。是一个"类"的实例化的个体。我们可以把"类"看成一个概念, 而对象就是这个"概念"的具体化的实例。比如说:”人“就是一个概念,我们都是人,都属于”人“类,我们每一个个体就是”人“类具体化的实例对象,在php中,当我们new一个类生成对象开始,这个对象就在内存中存在,不管我们给这个对象创建多少个引用(把这个对象付给某个或某些变量),这个对象在内存中永远是唯一的,比如:

  1. class A{}  
  2. $a = new A;//这里创建了一个对象,并且它的引用为 $a  
  3. $b = $a;//$a引用的对象又做了第二个引用$b,注意这里不是复制,复制一个对象用clone方法
  4. $a->content = 'b';  
  5. unset($a);  
  6. //这时, 释放的$a的内存, 但是它所指向的对象还在内存中存在, 并且它现在仅有一个引用($b)  
  7. echo $b->content; //这里输出: b


        好了,理解了上面的内容,接下来的观察者设计模式就相对简单了.
        ”观察者设计模式", 顾名思义就是有两个成员,一个成员称之为"观察者",一个成员称之为"被观察者",当被观察者的状态发生改变时,可以被所有的观察者收到(个人感觉,有点儿像触发器的),与触发器不同的是,被观察者不需要知道有多少个观察者(宏观上的概念),只需建立观察者时,告诉谁是被观察者就行了,当被观察者发生改变的时候,所有的观察者都要接收到通知,在代码上的表现如下:

  1. //建立被观察者
  2. $subject = new Subject;
  3. //在建立观察者, 这时只需告诉被观察者是谁
  4. $observer1 = new observer1($subject);
  5. $observer2 = new observer2($subject);
  6. $observer3 = new observer3($subject);
  7. $subject->message = '所有的观察者, 都动起来吧 <hr />';
  8. $subject->notification();//被观察者并不知道有几个观察者, 只要在建立观察者时, 告诉被观察者是谁就行了


        怎么样?神奇吧!哈哈~这是怎么实现的呢?请继续把~


  1. //被观察者  
  2. class Subject{  
  3.         //所有的观察者  
  4.         var $observer = array();  
  5.   
  6.         //设置观察者,这个方法由被观察者调用
  7.         function setObserver( $observer ){  
  8.                 $this->observer[] = $observer;  
  9.         }  
  10.   
  11.         //把观察者的状态(或是其他), 通知给被观察者  
  12.         function notification(){  
  13.                 if( !empty($this->observer) ){  
  14.                         foreach($this->observer as $observer){  
  15.                                 $observer->{$observer->updateFun()}( $this->message );  
  16.                         }  
  17.                 }  
  18.         }  
  19. }
  20.   
  21. //观察者类1  
  22. class observer1{  
  23.         //被观察者  
  24.         var $subject = '';  
  25.   
  26.         function observer1($subject){  
  27.                 $this->subject = $subject;  
  28.                 $this->subject->setObserver($this);  
  29.         }  
  30.   
  31.         function updateMessage($message){  
  32.                 echo '我是 observer1: ' . $this->subject->message;  
  33.         }  
  34.   
  35.         //当被通知时, 告诉观察者通知接口  
  36.         function updateFun(){  
  37.                 return 'updateMessage';  
  38.         }  
  39. }  
  40.   
  41. //观察者类2  
  42. class observer2{  
  43.         //被观察者  
  44.         var $subject = '';  
  45.   
  46.         function observer2($subject){  
  47.                 $this->subject = $subject;  
  48.                 $this->subject->setObserver($this);  
  49.         }  
  50.   
  51.         function update($message){  
  52.                 echo '我是 observer2: ' . $this->subject->message;  
  53.         }  
  54.   
  55.         //当被通知时, 告诉观察者通知接口  
  56.         function updateFun(){  
  57.                 return 'update';  
  58.         }  
  59. }  
  60.   
  61. //观察者类2  
  62. class observer3{  
  63.         //被观察者  
  64.         var $subject = '';  
  65.   
  66.         function observer3($subject){  
  67.                 $this->subject = $subject;  
  68.                 this->subject->setObserver($this);  
  69.         }  
  70.   
  71.         function notification($message){  
  72.                 echo '我是 observer3: ' . $this->subject->message;  
  73.         }  
  74.   
  75.         //当被通知时, 告诉观察者通知接口  
  76.         function updateFun(){  
  77.                 return 'notification';  
  78.         }  
  79. }  
  80.   
  81.   


        看完了是不是觉得不神奇啦~,有点儿像魔术的意思吧!把所有的控制都封装到了类的里面,在外面直接调用就行了,这就是观察者设计模式,只要按照这个规则写好的代码,然后外面用起来很舒服啦。也就是设计模式要达到的目标!!!

原文地址:https://www.cnblogs.com/shenming/p/4213648.html