PHP设计模式---观察者模式(Observer Pattern)

定义

定义了一对多的依赖关系;多个观察者对象对主题对象的依赖,主题对象一旦改变,就会自动更新观察者的数据

实例

比如一个求职者(观察者)和一个猎头(主题)
求职者告诉猎头要找工作,猎头就添加一个求职者在求职名单中,当有求职信息的时候就会通知名单中的每一个求职者。求职者也可以告诉猎头说我不要信息了,猎头就将数据名单中的数据删除,求职者也可以作为一个猎头。因为每一次猎头发送的求职信息给每一个求职者,这个求职者就可以将这个数据发送给自己,求职名单中的每一个二级求职者,观察者也可以使主题对象。

原理

    定义一个主题接口{
        方法1 :添加一个观察者方法;
        方法2 :删除一个观察者方法;
        方法3 :当主题改变时,通知所有观察者方法;
    }

    定义一个观察者接口{
       方法1 :当主题改变时主题会把信息当成参数的形式传递给这个方法;每个观察者都自行处理这些数据;
    }
    实现主题接口
    class aa implements 接口{
         $ a=null;定义一个变量用于表示当该变量改变时候传递给子类观察者
        定义一个数组存放观察者(其实都是引用)

        实现添加观察者方法(类型约束 观察者对象  ){
          数组[ 类名称]=类名
        } 

        实现删除观察者方法(类型约束  观察者对象){
            unset(数组[类名])
        }
        实现通知观察者对象方法(){
            foreach 数组,调用观察者对象中的方法1(参数是$a);
        }

        // 什么时候通知观察者呢,就是当主题数据发生改变时候
        public function (){
            if(isset($this->a)){
            }//这个就是当你NEW 一个主题对象的初始化的时候就会通知观察者    
        }
            //或者是把这个属性私有化,当改变实例的私有属性的时候调用通知方法     
            public function __set($a,$b){
                $this->$a=$b;
                调用通知观察者方法($this->a)
}

     实现观察者接口{
        重写接口中的那个抽象方法(){
            //这里体现一个多太的意思,不同的子类实现不同的数据操作
        }
    }