php設計模式--觀察者模式

来源:http://www.cnblogs.com/yuankeji/archive/2016/05/24/5523453.html
-Advertisement-
Play Games

在php5.0.1版本中提供了SplSubject和SplObserver兩個介面幫助開發這實現觀察者模式。 被觀察者: 觀察者: 觀察者模式的簡單理解: 在官網API中提供了一個例子是這樣的。現在有幾種報紙,諸如美國日報、中國日報之類的,每類報紙都有固定的訂閱者。現在有個需求是:每當報紙發佈新的新 ...


在php5.0.1版本中提供了SplSubject和SplObserver兩個介面幫助開發這實現觀察者模式。

被觀察者:

SplSubject {
/* 方法 */
abstract public void attach ( SplObserver $observer )
abstract public void detach ( SplObserver $observer )
abstract public void notify ( void )
}

觀察者:

SplObserver {
/* 方法 */
abstract public void update ( SplSubject $subject )
}

觀察者模式的簡單理解:

在官網API中提供了一個例子是這樣的。現在有幾種報紙,諸如美國日報、中國日報之類的,每類報紙都有固定的訂閱者。現在有個需求是:每當報紙發佈新的新聞的時候,其相對應的訂閱者都可以收到該新聞的內容。

這樣的例子在日常開發中很常見,諸如我們訂閱了一些科技雜誌或者桃色新聞,然後,在我們的註冊郵箱中,邊會是不是的收到一些郵件。於是我們可以這樣簡單的理解。

新聞雜誌是被觀察者,我們作為觀察者,新聞雜誌有個發佈新聞的小視窗,每當這個視窗有迅猛的爆料時,我們立馬虎視眈眈的發現了。於是,我們書寫代碼:

<?php


/**
 * 定義被觀察者:新聞雜誌
 */
class Newspaper  implements SplSubject{

    private $name;
    private $observers = array();
    private $content;

    public function __construct($name){
        $this->name = $name;
    }

     public function attach (SplObserver $observer ){
         $this->observers[] = $observer;
     }

     public function detach (SplObserver $observer ){
         $key = array_search($observer, $observers);
         if($key){
             unset($this->observers[$key]);
         }
     }

     public function notify( ){
         foreach ($this->observers as $value) {
             $value->update($this);
         }
     }

     public function getContent(){
         return $this->content;
     }

     public function breadOut($content){
         $this->content = $content;
         $this->notify();
     }

}

/**
 * 定義觀察者:訂閱用戶
 */
class Reader implements SplObserver{
    private $name;
    public function __construct($name){
        $this->name = $name;
    }
    public function update(SplSubject $subject) {
        echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>';
    }

}
/**
 * 實例化新聞雜誌
 * @var Newspaper
 */
$USANews = new Newspaper('USA NEWS');
$CHINANews = new Newspaper('CHINA NEWS');

/**
 * 實例化讀者
 * @var Reader
 */
$jack = new Reader('jack');
$tom = new Reader('tom');

/**
 * 訂閱用戶在這一刻訂閱了該報紙
 */
$USANews->attach($jack);
$USANews->attach($tom);


$sange = new Reader('zhangsan');
$siye = new Reader('lisi');

$CHINANews->attach($sange);
$CHINANews->attach($siye);

/**
 * 新聞雜誌小視窗打開,開始爆料
 */
$USANews->breadOut('USA break out');
$CHINANews->breadOut('CHINA break out');

運行結果如下:

jack is reading breakout news USA break out
tom is reading breakout news USA break out
zhangsan is reading breakout news CHINA break out
lisi is reading breakout news CHINA break out

每類報紙相對應的訂閱者都收到了該類報紙的爆料。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習完如何寫'hello world'之後,我們還是不太滿意,因為這樣代碼就寫死了,以後運行的時候都只列印一局固定的話而已。 但是,我想在程式運行後,自己手動輸入內容怎麼辦,此時就要學習如何使用用戶交互了。 在python2.x中,用戶交互使用的是 raw_input("提示內容") 方法,例如 之 ...
  • 環境為centos 7,已經安裝了jdk7, jdk必須要安裝7及以上版本 1. 切換到非root用戶(目前的es不能使用root用戶) 1. 下載es並解壓: wget https://download.elasticsearch.org/elasticsearch/release/org/ela ...
  • 之前的路由模式是通過key相等來匹配 而通配符,顧名思義,符合條件,則進行消息匹配發送 將路由鍵和某模式進行匹配。此時隊列需要綁定要一個模式上。 符號“#”匹配一個或多個詞,符號“*”匹配不多不少一個詞。 因此“audit.#”能夠匹配到“audit.irs.corporate”,但是“audit. ...
  • 路由模式其實和訂閱模式差不多,只不過交換機的類型不同而已 路由模式可以用下圖來表示,比訂閱模式多了一個key,舉個慄子就是根據不同的人群來訂閱公眾號,來收取消息 根據不同的key來獲取不同的消息 最簡單的就是男性用戶以及女性用戶的關註信息是不同的,推送的內容當然也是根據不同分類來推送 下圖就是微信公 ...
  • You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single ...
  • [導讀] 這篇文章是圍繞PHP的學習問題,之前介紹過《重磅資料!Github上的PHP資源彙總大全》《深入探討PHP類的封裝與繼承》《PHP的學習規劃建議》等對PHP學習有幫助的內容,為了你可以更好地學習PHP,這次主要是想說一下PHP的學習線路,文末還有10條PHP性能優化的小技巧介紹哦。 這篇文 ...
  • 學習任何一門語言的第一步,首先要寫個'hello world',這算是程式員的一個傳統。但在寫之前,還有註意幾個問題。 首先,python是一門腳本語言,而腳本語言的特點就是:我們寫的代碼會先由解釋器進行編譯以後,再去執行。但是當我們的程式運行在操作系統之上時,系統並沒有那麼智能,能夠自動識別出我們 ...
  • Python是躋身於當代IT世界最流行和代碼最高效的編程語言之一。Python框架能幫助你快速啟動Web應用。 1.CubicWeb CubicWeb的最重要的功能是其代碼的可重用性,由一個個代碼單元組成。它靈活又強大,並且還有一些特別的功能,包括RQL查詢語言和支持有效編碼的語義視圖功能。這是語義 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...