• 设计模式-观察者模式


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


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

  • 相关阅读:
    [BZOJ3398] [Usaco2009 Feb]Bullcow 牡牛和牝牛(动态规划)
    [BZOJ3399] [Usaco2009 Mar]Sand Castle城堡(排序)
    [VIJOS1003] 等价表达式(表达式解析)
    [BZOJ4690] Never Wait for Weights(并查集)
    sql server 查出数据库表结构
    sql server 时间日期转换
    LINQ语法详解
    方法练习题
    数组练习题
    第四章 JAVA数组知识点
  • 原文地址:https://www.cnblogs.com/shenming/p/4213648.html
Copyright © 2020-2023  润新知