日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

php設(shè)計(jì)模式

 印度阿三17 2019-07-14

1、什么是觀察者模式?

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

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

流程圖如下:

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

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

3、應(yīng)用場景

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

4、示例代碼

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

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

/**
 * @purpse: 定義狗狗類,繼承觀察者接口,實(shí)現(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 給所添加的觀察者的一個(gè)唯一 key,方便從注冊樹中移除觀察者
     * @param Observer $observer 觀察者對象
     * @return mixed
     */
    public function addObserver($key, Observer $observer);

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

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

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

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

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多