PHP設計模式-觀察者模式

史蒂芬勞埃德沃特金斯 ,週二09年12月29日下午10時02

我一直在閱讀深入淺出設計模式 最近決定寫一些PHP的例子模式,為自己的利益。 第一個,我已經決定了的代碼是Observer模式 正式的定義,Observer模式是:

觀察者模式 (異步的一個子集發布/訂閱模式 )是一種軟件 設計模式 ,其中一個對象 ,叫做主體,維護其家屬的名單,被稱為觀察員,並通知他們自動的任何狀態變化,通常是通過調用他們的一個方法 它主要用於實現分佈式事件處理系統。

隨著系統變得更加松耦合確保事件發生時,所有系統,這需要了解這些更新通知。 例如,一個博客文章,救了他的文章中,我們可能需要更新的搜索引擎(如Lucene的),更新我們的地圖,標籤,電子郵件訂閱用戶等觀察員模式允許開發者添加更多的聽眾,而無需編輯自己的觀察對象。 通過注射觀察員(即搜索引擎更新的觀察員,一個 sitemap發電機等):一個主題(即博客文章編輯系統),我們可以允許它執行所有必要的更新,不作任何修改。

觀察者模式之前慣用的伎倆是確定的將是更新的觀察對象與其他行代碼來更新所需的系統,並消除該行的代碼需要。 這並不容易允許添加和刪除觀察員。

這個主題的所有更新其觀察員通過更新方法。 此更新方法調用一個方法,每一個觀察員,這是源於實現接口。 觀察員可以自己通過添加刪除方法在觀察對象。

這基本上就是它! 我一直覺得一個例子是最好的方法學習 /了解,這裡是我的代碼示例,...

Observer模式在PHP中

在我的例子中,我已經創建了一個新聞系統(NewsAggregator),它發出的頭條新聞更新,更小的新聞聯播。 這裡的新聞系統正發生地點的主題觀測等而採取的新聞聯播的作用觀察員聽眾

一旦初始化觀察員可以附加和分離自己從主題,因為他們認為合適的。 在我的例子,我創建了三個觀察員,這些掃描的頭條派出由主體和'喊'的消息,如果其適當。 這三個觀察員下述條件,他們隨著掃描當接收新聞標題:

  • 體育觀察:'橄欖球','足球','網球'
  • 新聞觀察:'政治','金融','政府'
  • 八卦觀察員:'名人','音樂','時尚'

這個問題後 initalising我添加的新聞和八卦觀察員和發送的新聞更新。 在此之後加入這項運動的觀察員以前更多的新聞更新發送出去。 最後的八卦觀察員被刪除前最後的新聞標題是發送出去。

三個不同的類實現接口觀察員觀察員 ,這讓他們有一個清晰的接口/方法,通過它們將得到更新。 只要他們實現Observer接口,他們將能夠自行附加的主題 這也不斷的編程範式'計劃對接口不實現'。 NewsAggregator類擴展了抽象類主體 ,它為我們提供所需的三個公共方法:

  1. updateObservers()
  2. addObserver()
  3. removeObserver()

該代碼可以看出東奔西跑, Observer模式在PHP運行 ,代碼可從這裡下載, Observer模式PHP代碼

觀察員腳本

  <?PHP的
 / **
  *本文件包含的觀察員
  *
  * @作者勞埃德沃特金斯
  * @自2009/12/23
  * /

抽象類科目
 {
	抽象的公共職能 addObserver(觀察員 $觀察員);
	抽象的公共職能 removeObserver(觀察員 $觀察員);
	抽象的公共職能 updateObservers($ newsHeadline);
 }

 / **
  *這是主題類的例子
  *
  * @作者勞埃德沃特金斯
  * @自2009/12/23
  * /
類 ArticleAggregator擴展科目
 {
	 / **
	  *保存的列表,我們的觀察員
	  *
	 風險值的數組 * @
	  * /
	 = $ _observerList保護陣列();

	 / **
	  *方法添加觀察員
	  *
	  * @ $風險觀察員觀察員
	  * @返回void
	  * /
	公共職能 addObserver(觀察員 $觀察員)
	 {
		 $這個 -> _observerList [] = $觀察員;
	 }

	 / **
	  *法去除觀察員
	  *
	  * @ $風險觀察員觀察員
	  * @返回布爾
	  * /
	公共職能 removeObserver(觀察員 $觀察員)
	 {
		的foreach($這個 -> _observerList美元的關鍵“=> $ OB)的{
			如果($轉播 == $觀察員){
				取消設置($這個 -> _observerList [$鍵]);
				返回true;
			 }
		 }
		返回false;
	 }

	 / **
	  *方法更新觀察員
	  *
	  * @風險字符串$ newsHeadline
	  * @返回void
	  * /
	公共職能 updateObservers($ newsHeadline)
	 {
		的foreach($這個 -> _observerList轉播美元){
			 $的OB ->“更新($ newsHeadline);
		 }
	 }

	 / **
	  *添加一個新的新聞故事
	  *
	  * @風險字符串$故事
	  * @返回void
	  * /
	公共職能 addNewsStory($故事)
	 {
		如果(空($故事)| |!is_string($故事)){
			拋出新InvalidArgumentException('需要一個新聞故事!');
		 }
		 $這個 -> updateObservers($故事);
	 }
 } 

主題 /觀測腳本

 <?的PHP / ** *本文件包含主題 * * @作者沃特金斯勞埃德自2009/12/23 * * @ / {抽象的抽象類科目公共職能 addObserver(觀察員 $觀察員);抽象的公共職能 removeObserver(觀察員 $觀察員);抽象的公共職能 updateObservers($ newsHeadline);} / ** *這是主題類的例子* * @作者沃特金斯勞埃德自2009/12/23 * * @ /類 ArticleAggregator擴展科目{/ ** *保存我們的觀察員的列表* @ VaR的數組 * / $ _observerList =保護陣列(); / ** *方法,將觀察員 * * @ $風險觀察員觀察員 * @返回void * /公共職能 addObserver(觀察員 $觀察員) {$這個 -> _observerList [] = $觀察員;} / ** *方法來刪除一個觀察者 * * @ $風險觀察員觀察員 * @返回布爾值* /公共職能 removeObserver(觀察員 $觀察員)的{foreach($這個 -> _observerList關鍵美元=>“$轉播){如果($轉播 == $觀察員){未設置($這個 -> _observerList [$鍵]);返回true;}}返回false;} / ** *方法來更新觀察員* * @ $ newsHeadline風險字符串* @返回void * /公共職能 updateObservers($ newsHeadline)的{foreach($這個 -> _observerList美元的轉播){$觀測 ->“更新($ newsHeadline);}} / ** *添加一個新的新聞故事* * @風險字符串$故事* @返回void * /公共職能 addNewsStory($故事){如果(空($故事)| |!is_string($故事)){拋出新InvalidArgumentException('需要一個新聞故事!');} $這個 -> updateObservers($故事);}} 

控制器腳本

  <?PHP的
 / **
  *觀測器設計模式的例子
  *
  * @作者勞埃德沃特金斯
  * @自2009/12/23
  * @鏈接 http://www.evilprofessor.co.uk
  * /
包括'observers.php';
包括'subject.php';

如果(!空(使用$ _SERVER ['HTTP_USER_AGENT'])){
    迴聲'
  ';
 }

 / /我們在做什麼?
 echo的觀察員模式的例子PHP中的'。  PHP_EOL;
迴聲 '================================'。  PHP_EOL;
 / /設置我們的主題
新ArticleAggregator主題 = $();
迴聲' - ArticleAggregator創造'。  PHP_EOL;

 / /添加一些觀察家
 $主題> addObserver(新NewsObserver());
 $主題> addObserver($ =新GossipObserver閒話());

迴聲' - 新增NewsObverser&GossipObserver'。
	  PHP_EOL。  PHP_EOL;

 / /嘟,嘟,嘟... 快訊!
 echo的資訊站:名人熱愛橄欖球運動員金融'。  PHP_EOL;
迴聲 '================================================ '。  PHP_EOL;
 $主題> addNewsStory('名人橄欖球運動員喜歡金融');
迴聲 PHP_EOL;

迴聲' - SportObserver已經發現了,想加入本集團';
 $主題> addObserver(新SportObserver());
迴聲 PHP_EOL。  PHP_EOL;

 / /嘟,嘟,嘟... 快訊!
 echo的資訊站:政府弄亂了!'   PHP_EOL;
迴聲 '======================================='。  PHP_EOL;
 $主題> addNewsStory('政府弄亂了!');
迴聲 PHP_EOL;

 / /嘟,嘟,嘟... 快訊!
 echo的資訊站:時尚和足球結合'。  PHP_EOL;
迴聲 '======================================='。  PHP_EOL;
 $主題> addNewsStory('時尚和足球結合');
迴聲 PHP_EOL;

 / /嘟,嘟,嘟... 快訊!
 echo的資訊站:音樂與政治,下一步如何?   PHP_EOL;
迴聲 '=========================================='。  PHP_EOL;
 $主題> addNewsStory('音樂與政治,何去何從?');
迴聲 PHP_EOL;

 / **
  *閒話增長很快厭倦了新聞,並已決定
  *停止聽,儘管有各種有趣的新聞吧!
  * /
迴聲' - GossipObserver是無聊和離任本集團! 
      PHP_EOL。  PHP_EOL;
 $主題> removeObserver($閒話);

 / /嘟,嘟,嘟... 快訊 - 更新到一個較早的故事!
 echo的最新資訊:時尚和足球結合說'。
      '政府'。  PHP_EOL;
迴聲 '================================================ '。
      '========='。  PHP_EOL;
 $主題> addNewsStory('時尚和足球結合'。
                         '說,政府');
迴聲 PHP_EOL;

如果(!空(使用$ _SERVER ['HTTP_USER_AGENT'])){
    迴聲' 

';

}

3回應“PHP設計模式 - 觀察者模式”

  1. 發誓 說:

    您好,
    首先,我的英語很差,然後
    你能告訴我什麼是系統中了嗎?
    Fedora的12?
    什麼是主題?

  2. 發誓 說:

    您好,
    你能告訴我什麼是系統中了嗎?
    Fedora的12?
    什麼是主題?

給一個答复













全景主題 Themocracy

現在 8訪客在線
7客人,1機器人,0位會員
最大遊客今日:12日上午1點 11分聯合技術
本月:26日2011年7月5日上午12點 35分聯合技術
今年:130 28-03-2011下午10時 40聯合技術
所有時間:130 28-03-2011下午10時 40聯合技術