观察者模式


对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
                                   

 

看不懂图的人端着小板凳到这里来,给你举个例子:假设有三个人,小美(女,28),老王和老李。小美很漂亮,很风骚,老王和老李是两个中年男屌丝,时刻关注着小美的一举一动。
有一天,小美说了一句:我老公今天不在家,一个人好无聊啊~~~,这句话被老王和老李听到了,结果乐坏了,
蹭蹭蹭,没一会儿,老王就冲到小美家门口了,于是进门了……………………..帕~啪啪啪啪啪~
在这里,小美是被观察者,老王和老李是观察者,被观察者发出一条信息,然后观察者们进行相应的处理,看代码:

interface Person{
    //老王和老李通过这个接口可以接收到小美发过来的消息
    public function getMessage($s);
}

 

这个接口相当于老王和老李的电话号码,小美发送通知的时候就会拨打getMessage这个电话,拨打电话就是调用接口,看不懂没关系,先往下看

class LaoWang implements Person{
    private $name='老王';
    public function getMessage($s)
    {
        echo $this->name.'接到了小美打过来的电话,电话内容是:'.$s."<br />";
    }
}

class LaoLi implements Person{
    private $name='老李';
    public function getMessage($s)
    {
        echo $this->name.'接到了小美打过来的电话,电话内容是:'.$s;
    }
}

代码很简单,我们再看看小美的代码:

class XiaoMei{
    private $_observers = array();

    public function addPerson($sub){
        $this->_observers[] = $sub;
    }

    public function notifyPerson(){
        if(!empty($this->_observers)){
            //遍历$_observers,把自己的通知发送给所有暗恋自己的人
            foreach($this->_observers as $observer){
                $observer->getMessage('今天家里就我一个人,你们过来吧,谁先过来谁就能得到我!');
            }
        }
    }
}

我们写一个测试类来看一下结果对不对

/**
 * Class Test 编写测试类
 */
class Test{
    public function main()
    {
        $LaoWang=new LaoWang();
        $LaoLi=new LaoLi();
        $XiaoMei=new XiaoMei();
        //老王和老李在小美那里都注册了一下
        $XiaoMei->addPerson($LaoWang);
        $XiaoMei->addPerson($LaoLi);
        //小美向老王和老李发送通知
        $XiaoMei->notifyPerson();
    }
}

ok完成。


总结
       
 当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。
 

 

posted @ 2017-06-22 14:38  尘缘Coding  阅读(74)  评论(0编辑  收藏  举报