国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP設計模式之觀察者模式

phpmatt / 836人閱讀

摘要:概念觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。觀察者模式符合接口隔離原則,實現(xiàn)了對象之間的松散耦合。

概念

觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。

當一個對象狀態(tài)發(fā)生改變后,會影響到其他幾個對象的改變,這時候可以用觀察者模式。

觀察者模式符合接口隔離原則,實現(xiàn)了對象之間的松散耦合。

別名

發(fā)布-訂閱模式

模型-視圖模式

源-收聽者模式

從屬者模式

角色

抽象主題(Subject):它把所有觀察者對象的引用保存到一個聚集里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。

具體主題(ConcreteSubject):將有關狀態(tài)存入具體觀察者對象;在具體主題內部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。

抽象觀察者(Observer):為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。

具體觀察者(ConcreteObserver):實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題狀態(tài)協(xié)調。

UML圖

代碼 示例代碼

在PHP SPL中已經提供SplSubject和SqlOberver接口,源碼如下:

/**
 * The SplSubject interface is used alongside
 * SplObserver to implement the Observer Design Pattern.
 * @link http://php.net/manual/en/class.splsubject.php
 */
interface SplSubject  {

        /**
         * Attach an SplObserver
         * @link http://php.net/manual/en/splsubject.attach.php
         * @param SplObserver $observer 

* The SplObserver to attach. *

* @return void * @since 5.1.0 */ public function attach (SplObserver $observer); /** * Detach an observer * @link http://php.net/manual/en/splsubject.detach.php * @param SplObserver $observer

* The SplObserver to detach. *

* @return void * @since 5.1.0 */ public function detach (SplObserver $observer); /** * Notify an observer * @link http://php.net/manual/en/splsubject.notify.php * @return void * @since 5.1.0 */ public function notify (); } /** * The SplObserver interface is used alongside * SplSubject to implement the Observer Design Pattern. * @link http://php.net/manual/en/class.splobserver.php */ interface SplObserver { /** * Receive update from subject * @link http://php.net/manual/en/splobserver.update.php * @param SplSubject $subject

* The SplSubject notifying the observer of an update. *

* @return void * @since 5.1.0 */ public function update (SplSubject $subject); }

下面我們根據(jù)這兩個spl接口,寫自己的代碼:

_observers)) {
            $this->_observers[] = $observer;
        }
    }

    /**
     * 實現(xiàn)移除觀察者方法
     *
     * @param SplObserver $observer
     */
    public function detach(SplObserver $observer)
    {
        if (false !== ($index = array_search($observer, $this->_observers))) {
            unset($this->_observers[$index]);
        }
    }

    /**
     * 實現(xiàn)提示信息方法
     */
    public function notify()
    {
        foreach ($this->_observers as $observer) {
            $observer->update($this);
        }
    }

    /**
     * 設置數(shù)量
     *
     * @param $count
     */
    public function setCount($count)
    {
        echo "數(shù)據(jù)量加" . $count . "
"; } /** * 設置積分 * * @param $integral */ public function setIntegral($integral) { echo "積分量加" . $integral . "
"; } } /** * Class Observer1 觀察者一 */ class Observer1 implements SplObserver { public function update(SplSubject $subject) { $subject->setCount(10); } } /** * Class Observer2 觀察者二 */ class Observer2 implements SplObserver { public function update(SplSubject $subject) { $subject->setIntegral(10); } } /** * Class Client 客戶端 */ class Client { /** * 測試方法 */ public static function test() { // 初始化主題 $subject = new Subject(); // 初始化觀察者一 $observer1 = new Observer1(); // 初始化觀察者二 $observer2 = new Observer2(); // 添加觀察者一 $subject->attach($observer1); // 添加觀察者二 $subject->attach($observer2); // 消息提示 $subject->notify();//輸出:數(shù)據(jù)量加1 積分量加10 // 移除觀察者一 $subject->detach($observer1); // 消息提示 $subject->notify();//輸出:數(shù)據(jù)量加1 積分量加10 積分量加10 } } // 執(zhí)行測試 Client::test();
運行結果
數(shù)據(jù)量加10
積分量加10
積分量加10
優(yōu)點和缺點 優(yōu)點

觀察者和主題之間的耦合度較小;

支持廣播通信;

缺點

由于觀察者并不知道其它觀察者的存在,它可能對改變目標的最終代價一無所知。這可能會引起意外的更新。

適用場景

當一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。

當對一個對象的改變需要同時改變其它對象,而不知道具體有多少個對象待改變。

當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換句話說,你不希望這些對象是緊密耦合的。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22051.html

相關文章

  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...

    Dionysus_go 評論0 收藏0
  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...

    vspiders 評論0 收藏0
  • PHP面試常考設計模式——建造者模式

    摘要:你好,是我琉憶,程序員面試筆試系列圖書的作者。建造者模式介紹建造者模式又名生成器模式,是一種對象構建模式。表示被構造的復雜對象。創(chuàng)建該產品的內部表示并定義它的裝配過程。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設計模式——工廠模式周三:PHP面試常考之設計模式——建造者模式周五:PHP面...

    alexnevsky 評論0 收藏0
  • php面向對象設計模式 察者模式

    摘要:最近在學的設計模式,看到了觀察者模式,在此寫下一點理解問題假如一個小販,他把產品的價格提升了,不同的消費者會對此產生不同的反應。 最近在學php 的設計模式, 看到了觀察者模式,在此寫下一點理解: 問題: 假如一個小販, 他把產品的價格提升了, 不同的消費者會對此產生不同的反應。一般的編程模式無非是獲取提升的價格,然后獲取所有的消費者,再循環(huán)每個消費者, 不同的消費者根據(jù)價格漲幅...

    genedna 評論0 收藏0
  • PHP設計模式察者模式

    摘要:觀察者模式解決的問題在我們的開發(fā)過程中,應該都或多或少的碰到過改動其中一部分代碼會引起其他一連串改變的問題,顯然想要完全避免這種情況不太可能,但我們也應答盡量減少對其他組件的依賴,而觀察者模式就是為了解決這個問題。 觀察者模式解決的問題 在我們的開發(fā)過程中,應該都或多或少的碰到過改動其中一部分代碼會引起其他一連串改變的問題,顯然想要完全避免這種情況不太可能,但我們也應答盡量減少對其他組...

    hizengzeng 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<