「PHP」觀察者模式模式

來源:互聯網
上載者:User

標籤:bsp   attach   分享   依賴   code   src   pat   觀察   obs   

引言   所屬:行為型模式,常用設計模式之一 原廠模式概述   觀察者模式定義了一種一對多的以來關係,讓多個觀察者對象勇士監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有的觀察者對象,使他們能夠自動更新自己   應用情境:當一個對象的改變需要同事改變其他對象的時候,而且它不知道具體有多少對象有待改變時,應該考慮使用觀察者模式。  觀察者模式所作的工作其實就是在接觸耦合。讓耦合的雙方都依賴於抽象類別,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化 舉個栗子     一家公司,使用者A喜歡玩遊戲,使用者B喜歡看股票,上班不好好工作,經常被老闆抓到,然後兩人想了一個方案:賄賂前台妹子,當老闆到前台的時候囑咐前台妹子通知一下,也好不被抓到,那麼程式如何設計呢。             流程圖如下:                

 

 

  程式設計代碼:1. 抽象觀察者,具體觀察者
<?php/** * 抽象觀察者 */namespace observer_factory;abstract class ObserverAbstract{    public abstract function update($news);}
<?php/** * 正在玩的員工 */namespace observer_factory;class NbaObserver extends ObserverAbstract{    protected $name;    protected $secretary;    public function __construct(string $name, SubjectInterface $secretary)    {        $this->name = $name;        $this->secretary = $secretary;    }    /**     * 收到通知後的具體操作     * @param $news     */    public function update($news)    {        echo $this->name.$news.‘不要在玩了,繼續工作!‘;    }}
<?php/** * 正在炒股的使用者 */namespace observer_factory;class StockObserver extends ObserverAbstract{    protected $name;    protected $secretary;    public function __construct(string $name, SubjectInterface $secretary)    {        $this->name = $name;        $this->secretary = $secretary;    }    /**     * 收到通知後的具體操作     * @param $news     */    public function update($news)    {        echo $this->name.$news.‘不要在看股票,繼續工作!‘;    }}

 

2. 抽象通知者,具體通知者

<?php/** * 抽象通知者 */namespace observer_factory;interface SubjectInterface{    /**     * 增加同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function attach($key, ObserverAbstract $observer);    /**     * 刪除同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function detach($key);    /**     * 發送訊息     */    public function notify();    /**     * @param $news     */    public function secretaryNews($news);}
<?php/** * 通知者A */namespace observer_factory;class SubjectA implements SubjectInterface{    /**     * 同事列表     */    private $list = [];    private $news;    /**     * 增加同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function attach($key, ObserverAbstract $observer)    {        $this->list[$key] = $observer;    }    /**     * 刪除同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function detach($key)    {        unset($this->list[$key]);    }    /**     * 發送訊息     */    public function notify()    {        foreach ($this->list AS $val) {            $val->update($this->news);        }    }    /**     * @param $news     */    public function secretaryNews($news)    {        $this->news = $news;    }}
<?phpnamespace observer_factory;class SubjectB implements SubjectInterface{    /**     * 同事列表     */    private $list = [];    private $news;    /**     * 增加同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function attach($key, ObserverAbstract $observer)    {        $this->list[$key] = $observer;    }    /**     * 刪除同事     * @param ObserverAbstract $observer 針對抽象變成,減少了與具體類的耦合,也就是只有在繼承抽象觀察者的具體觀察者才可以使用     */    public function detach($key)    {        unset($this->list[$key]);    }    /**     * 發送訊息     */    public function notify()    {        foreach ($this->list AS $val) {            $val->update($this->news);        }    }    /**     * @param $news     */    public function secretaryNews($news)    {        $this->news = $news;    }}

 

3. 測試

<?phpnamespace observer_factory;include ‘../autoload.php‘;// 通知者A 進行通知$tongzhizhe = new SubjectA();$tongshi1 = new NbaObserver(‘使用者A‘, $tongzhizhe);$tongshi2 = new StockObserver(‘使用者B‘, $tongzhizhe);$tongzhizhe->attach(‘使用者A‘, $tongshi1);$tongzhizhe->attach(‘使用者B‘, $tongshi2);$tongzhizhe->secretaryNews(‘老闆回來了‘);$tongzhizhe->notify();

 

 以下為源碼地址

  

  GitHub源碼地址:https://github.com/xiaobaoword/design_pattern/tree/master

 

「PHP」觀察者模式模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.