也谈观察者模式

  不是你写个class 就是面向对象,我基本是都是面向过程来书写class,只是like oo 非 is oo 。 所以写出来的不伦不类,自己也都懒得看别说重构,只能重写。设计模式是面向对象层级较高的部分,属于面向对象的OOD(面向对象设计)。如果对面向对象分析与设计精通,那么读起来会产生共鸣甚至共振。如果是了解面向对象,读起来像白开水,没感觉。因为层级没达到,无法参悟。就像参禅一样。设计模式是遵循面向对象五大原则前提下,高手们给出典型问题的解决办法。设计模式不是重点,重点是那几大原则。

  oh,say too long。最近在研究观察者模式,举一个简单的例子 :  猫大叫一生,所有的老鼠都跑了,主人惊醒了 这就是一个经典的 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,发起者是猫,观察者是老鼠,主人以及其他的生物。  发起者猫又称主题。就是什么玩意都要有个主题的意思。 这个猫主题有几个接口就是 :  观察者的增加和删除,叫。 那么我们定义这个主题的接口可以这么写

interface Subject {
    public function registerObserver(Observer $obs);
    public function removeObserver(Observer $obs);
    public function cry();
}

在定义观察者的接口

interface Observer{
    public function update();
}

ok 两个接口定义好了!

因为猫是主题,所以用cat来实现主题接口

class Cat implements Subject 
{
    private $_observers = array();
    
    public function registerObserver(Observer $obs) {
        $this->_observers[]= $obs;
    }
    
    public function removeObserver( Observer $obs){
        $index = array_search($obs, $this->_observers);
        if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
            return FALSE;
        }
        unset($this->_observers[$index]);
        return TRUE;
    }
    
    public function cry() {
    
        if (!is_array($this->_observers)) {
            return FALSE;
        }
        
        foreach ($this->_observers as $value) {
            $value->update();
        }
    }

}

好主题的实例化完成了

观察者就很简单了

class Mouse implements Observer
{
    private $_name;
    function __construct($name, $subject) {
        $this->_name = $name;
        $subject->registerObserver($this);
    }
    
    public function update()
    {
         echo $this->_name ."拼命的跑\n<br>";    
    }
}



class Master implements Observer
{
    private $_name;
    function __construct($name, $sbuject){
        $this->_name = $name;
        $sbuject->registerObserver($this);    
    }
    public function update()
    {
        echo $this->_name ."主任被惊醒!\n";
    
    }
}

实例化调用

class Client {

    public static function main(){
        $cat = new Cat();
        $mouseBig   = new Mouse('大老鼠',$cat);
        $mouseSmall = new Mouse('小老鼠', $cat); 
        $master = new Master('美女', $cat);
        $cat->cry();
    }
    
}

Client::main();

ok ,完了!以上自己练着玩,如有雷同,算我抄你

原文地址:https://www.cnblogs.com/liuzhang/p/2941653.html