zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式

     在研究这个模式之前,我们要尽可能的知道面向对象编程的概念,充分了解"对象"的在程序中的含义。
            "对象" 是一个有自己的属性、方法的整体。是一个"类"的实例化的个体。我们可以把"类"看成一个概念, 而对象就是这个"概念"的具体化的实例。比如说:”人“就是一个概念,我们都是人,都属于”人“类,我们每一个个体就是”人“类具体化的实例对象,在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.   


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

  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/shenming/p/4213648.html
Copyright © 2011-2022 走看看