• 浅谈观察者设计模式


    记得刚学joomla的时候, 在某些教学网站上提到joomla的代码设计模式是是"观察者设计模式", 那是我第一次听到"设计模式"的概念.随后就wiki了一下这个模式.可能当时对面向对象的编程方式的认识只是停留在创建一个 class, 然后 new 它. 于是怎么读那段文字也不明所以. 总好像明白了, 但是又什么都不明白. 现在回过头来看看这个模式. 终于找到了理解这个模式的接入点. 下面我和大家一起重头开始研究下这个 "观察者设计模式"
            在研究这个模式之前. 我们要尽可能的了解面向对象编程. 充分了解"对象"的含义.
            "对象", 是一个有自己的属性, 方法的整体. 是一个"类"的实例化的个体.我们可以把"类"想像成一个具体的概念, 而对象就是这个"概念"的具体化的实例.当我们new一个类生成对象开始, 这个对象就在内存中存在, 不管我们给这个对象创建多少个引用(把这个对象付给某个或某些变量), 这个对象在内存中永远是唯一的.比如:

    class A{}
    $a = new A;//这里创建了一个对象,并且它的引用为 $a
    $b = $a;//$a引用的对象又做了第二个引用$b
    $a->content = 'b';
    unset($a);
    //这时, 释放的$a的内存, 但是它所指向的对象还在内存中存在, 并且它现在仅有一个引用($b)
    echo $b->content; //这里输出: b



            如果足够的了解的对象的含义, 接下来的观察者设计模式就相对简单了.
            "观察者设计模式", 顾名思义, 就是有两类成员, 一类成员称之为"观察者", 一类成员称之为"被观察者", 当被观察者的状态发生改变时, 可以被所有的观察者收到(个人感觉,有点儿像触发器, 一个触发点上邦上多个方法.当这个触发点触发时, 那么运行与之绑定的所有的方法,但是这个触发器并不知道有多少个触发的方法).代码结构如下:

            //被观察者
            class Subject{
                //所有的观察者
                var $observer = array();
    
                //设置观察者
                function setObserver( $observer ){
                    $this->observer[] = $observer;
                }
    
                //把观察者的状态(或是其他), 通知给被观察者
                function notification(){
                    if( !empty($this->observer) ){
                        foreach($this->observer as $observer){
                            $observer->{$observer->updateFun()}( $this->message );
                        }
                    }
                }
    
    
            }
    
            //观察者类1
            class observer1{
                //被观察者
                var $subject = '';
    
                function observer1($subject){
                    $this->subject = $subject;
                    $this->subject->setObserver($this);
                }
    
                function updateMessage($message){
                    echo '我是 observer1: ' . $this->subject->message;
                }
    
                //当被通知时, 告诉观察者通知接口
                function updateFun(){
                    return 'updateMessage';
                }
            }
    
            //观察者类2
            class observer2{
                //被观察者
                var $subject = '';
    
                function observer2($subject){
                    $this->subject = $subject;
                    $this->subject->setObserver($this);
                }
    
                function update($message){
                    echo '我是 observer2: ' . $this->subject->message;
                }
    
                //当被通知时, 告诉观察者通知接口
                function updateFun(){
                    return 'update';
                }
            }
    
            //观察者类2
            class observer3{
                //被观察者
                var $subject = '';
    
                function observer3($subject){
                    $this->subject = $subject;
                    $this->subject->setObserver($this);
                }
    
                function notification($message){
                    echo '我是 observer3: ' . $this->subject->message;
                }
    
                //当被通知时, 告诉观察者通知接口
                function updateFun(){
                    return 'notification';
                }
            }
    
    
            //调用代码
            //被观察者
            $subject = new Subject;
    
            //在建立观察者时, 告诉被观察者是谁
            $observer1 = new observer1($subject);
            $observer2 = new observer2($subject);
            $observer3 = new observer3($subject);
    
            $subject->message = '所有的观察者, 都动起来吧 <hr />';
            $subject->notification();//被观察者并不知道有几个观察者, 只要在建立观察者时, 告诉被观察者是谁就行了



  • 相关阅读:
    自动化部署功
    docker 安装
    批量操作
    centos7 内核升级
    centos 6.5 升级 内核
    如何进行再linux 下查看 java程序的堆栈信息
    binlog 日志恢复以及操作
    java 中 Integer 比较 问题
    docker 使用
    soucetree 安装
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2987566.html
Copyright © 2020-2023  润新知