小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

php設(shè)計模式

 印度阿三17 2019-07-14

1、什么是觀察者模式?

從面向過程的角度來看,首先是觀察者向主題注冊,注冊完之后,主題再通知觀察者做出相應(yīng)的操作,整個事情就完了

從面向?qū)ο蟮慕嵌葋砜?,主題提供注冊和通知的接口,觀察者提供自身操作的接口。(這些觀察者擁有一個同一個接口。)觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者。耦合度相當(dāng)之低

流程圖如下:

2、為什么要用觀察者模式?

觀察者模式更多體現(xiàn)了兩個獨立的類利用接口完成一件本應(yīng)該很復(fù)雜的事情。不利用主題類的話,我們還需要不斷循環(huán)創(chuàng)建實例,執(zhí)行操作。而現(xiàn)在只需要創(chuàng)建實例就好,執(zhí)行操作的事兒只需要調(diào)用一次通知的方法就好啦

3、應(yīng)用場景

當(dāng)一個對象的改變需要同時改變其他對象的時候,而且它不知道具體有多少對象有待改變時,應(yīng)該考慮使用觀察者模式。

4、示例代碼

/**
 * @purpose: 觀察者接口, 定義觀察者具體需要執(zhí)行的方法,當(dāng)然方法名和方法個數(shù)可以自定義
 * Interface Observer
 */
interface Observer
{
    /**
     * @purpose: 廣播通知后,所有已注冊的觀察者都需要執(zhí)行該方法。
     * @return mixed
     */
    public function eat();
}

/**
 * @purpse: 定義貓貓類,繼承觀察者接口,實現(xiàn)具體細(xì)節(jié)
 * Class Cat
 */
class Cat implements Observer{
    public function eat(){
        echo 'Cat eat fish';
    }
}

/**
 * @purpse: 定義狗狗類,繼承觀察者接口,實現(xiàn)具體細(xì)節(jié)
 * Class Dog
 */
class Dog implements Observer{
    public function eat(){
        echo 'Dog eat bones';
    }
}



/**
 * @purpose: 主題接口, 定義添加觀察者和廣播通知的方法
 * Interface Notify
 */
interface Subject
{
    /**
     * @purpose: 添加觀察者
     * @param string $key 給所添加的觀察者的一個唯一 key,方便從注冊樹中移除觀察者
     * @param Observer $observer 觀察者對象
     * @return mixed
     */
    public function addObserver($key, Observer $observer);

    /**
     * @purpose: 從注冊樹中移除觀察者
     * @param string $key 給所添加的觀察者的一個唯一 key,方便從注冊樹中移除觀察者
     * @return mixed
     */
    public function removeObserver($key);

    /**
     * @purpose: 廣播通知以注冊的觀察者
     * @return mixed
     */
    public function notify();
}

/**
 * @purpose: 實現(xiàn)主體接口,主要就是添加觀察者和廣播通知觀察者
 * Class Action
 */
class Action implements Subject
{
    /**
     * @var array 保存所有已注冊的觀察者
     */
    public $_observer = [];

    /**
     * @purpose: 添加觀察者
     * @param string $key 給所添加的觀察者的一個唯一 key,方便從注冊樹中移除觀察者
     * @param Observer $observer 觀察者對象
     * @return mixed
     */
    public function addObserver($key, Observer $observer)
    {
        $this->_observer[$key] = $observer;
    }

    /**
     * @purpose: 從注冊樹中移除觀察者
     * @param string $key 給所添加的觀察者的一個唯一 key,方便從注冊樹中移除觀察者
     * @return mixed
     */
    public function removeObserver($key)
    {
        unset($this->_observer[$key]);
    }

    /**
     * @purpose: 廣播通知以注冊的觀察者,對注冊樹進行遍歷,讓每個對象實現(xiàn)其接口提供的操作
     * @return mixed
     */
    public function notify()
    {
        foreach ($this->_observer as $observer) {
            $observer->eat();
        }
    }
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多