也談觀察者模式


  不是你寫個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 ,完了!以上自己練着玩,如有雷同,算我抄你


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM