PHPのデザインパターン-オブザーバーパターン

スティーブンロイドワトキン 2009年12月29日(火曜日)22:02

私が読んでいるヘッドファーストデザインパターン 最近では、自分の利益のためにPHPの例として、パターンのいくつかを記述することを決めた。 ようにコーディング交流第一決めた私は、1つは、 Observerパターン Observerパターンの正式な定義は以下です:

オブザーバーパターンは、(非同期のサブセットパターンを公開/サブスクライブ )はソフトウェアの デザインパターンにおいてオブジェクトが呼ばれ、件名、オブザーバーと呼ばれる扶養維持のリストを、その、と呼び出すことによって、通常、任意の状態の変化を自動的に通知する彼らのいずれかの方法 これは主に分散イベント処理システムを実装するために使用されています。

となるシステムは、より緩やかにイベントがこれらの更新プログラムの知識が通知される必要なすべてのシステムを発生したときことを確認して結合されたように。 たとえば、ブログの投稿は、投稿を保存した後、我々は、検索エンジン(Luceneを例)を更新する必要がありますなどオブザーバーパターン我々のサイトマップを、タグ、電子メール購読ユーザ、更新、開発者が編集することなく、観測オブジェクトを追加リスナーを追加することができます。 オブザーバーを注入することにより我々はそれを変更せずにすべての必要な更新を実行できるようにすることができます対象(すなわち、ブログの記事編集システム)に(検索エンジンの更新プログラムのオブザーバを、サイトマップ生成などすなわち)。

Observerパターンは、通常のトリックが必要なシステムを更新するコードの追加行で観測オブジェクトを更新することです識別される前に、コードの行を削除し、必要に応じて。 これは簡単に追加および削除オブザーバーに許可されていません。

件名、更新プログラムのメソッドを介して、そのすべてのオブザーバ。 この更新方法は、インターフェイスを実装から派生されている各オブザーバのメソッドを呼び出します。 オブザーバーは、観測オブジェクトのメソッドを介して自分自身を削除追加することができます。

それは基本的にです! 私はいつもの例では、/ですので、ここで理解する私の交流コードの例を学習する最良の方法であることがわかりました...

パターン内のオブザーバーのPHP

この例では私の私がニュースフィードが出てニュースのヘッドラインの更新を小さくした送信(NewsAggregator)システムをニュース作成しました。 ここではニュースのsytem Listeners オブザーバー etcまたは一方のニュースフィードの役割を果たして観測条件として 、かかる場所を。

一度初期化オブザーバーは添付することができます、彼らが合うように対象から自分自身を切り離します。 私の例で私は見出しは、サブジェクトから送信されたスキャン、これらとその必要に応じてニュースを'コメント'三オブザーバーを作成している。 三オブザーバは、以下に沿って条件に、彼らはスキャン指定されていない場合、受信ニュースの見出し:

  • スポーツオブザーバー:'ラグビー'、'サッカー'、'テニス'
  • ニュースオブザーバー:'政治'、'金融'、'政府'
  • ゴシップオブザーバー:'セレブ'、'音楽'、'ファッション'

件名をinitalising後、私はニュースやゴシップオブザーバーを追加し、ニュースの更新を送信します。 より多くのニュースの更新が送信される前にこの後、スポーツオブザーバが追加されます。 最終的なニュースの見出しが送信される前に、最後のゴシップオブザーバが削除されます。

つの異なるオブザーバークラスは、Observerを実装するインターフェイスは、この更新プログラムを与えるように明確なインターフェイスを/を通してメソッドが表示されますは。 題目提供添付自身を、彼らがすることができる彼らはインターフェイスをオブザーバー実装されています。 また、これは'インターフェイスでは実装するのはプログラムのプログラミングパラダイムと続けている。 NewsAggregatorクラスは、メソッドで必要な3つの公共拡張たちを提供する抽象クラスの件名

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

コードは、ここで実行して見ることができるPHPのパターンがオブザーバー実行すると、コードはここからダウンロードすることができるPHPコードのObserverパターン

オブザーバースクリプト

 する<?PHPの
 / **
  *このファイルには、オブザーバーが含まれています
  *
  * @著者ロイドワトキン
  2009/12/23 @以降*
  * /

抽象クラス題目
 {
	抽象的なパブリック関数addObserver(オブザーバー$オブザーバ);
	抽象的なパブリック関数removeObserver(オブザーバー$オブザーバ);
	抽象的なパブリック関数updateObservers($ newsHeadline);
 }

 / **
  *これは、例えば、対象のクラスです
  *
  * @著者ロイドワトキン
  2009/12/23 @以降*
  * /
クラスArticleAggregator Subjectを拡張
 {
	 / **
	  ※当社のオブザーバーのリストを保持する
	  *
	  * @ VARの配列
	  * /
	保護$ _observerList =配列();

	 / **
	  *オブザーバを追加する方法
	  *
	  * @ VARのオブザーバー$は、オブザーバ
	  * @ voidを返す
	  * /
	パブリック関数addObserver(オブザーバー$オブザーバー)
	 {
		の$ this -> _observerList [] = $オブザーバ;
	 }

	 / **
	  *オブザーバを削除する方法
	  *
	  * @ VARのオブザーバー$は、オブザーバ
	  * @ returnのブール
	  * /
	パブリック関数removeObserver(オブザーバー$オブザーバー)
	 {
		 foreachの{(の$ this -> _observerList $ ASのキー= $はローテンブルク>)
			 ($ローテンブルク== $オブザーバー)が{
				 unsetは(の$ this -> _observerList [キードル]);
				 trueを返します。
			 }
		 }
		 falseを返す。
	 }

	 / **
	  *メソッドは、オブザーバーを更新する
	  *
	  * @ VARの文字列$はnewsHeadline
	  * @ voidを返す
	  * /
	パブリック関数updateObservers($ newsHeadline)
	 {
		 foreachの(の$ this ->ローテンブルク$として_observerList){
			 $ローテンブルク->更新プログラム($ newsHeadline);
		 }
	 }

	 / **
	  *は、新しいニュース記事を見る
	  *
	  * @ VARの文字列$の話
	  * @ voidを返す
	  * /
	パブリック関数addNewsStory($物語)
	 {
		 {(| |!IS_STRING型($物語)空($物語))が
			新しいInvalidArgumentExceptionを('!ニュース記事を期待される')をスローします。
		 }
		の$ this - updateObservers($物語)>;
	 }
 } 

題目/観測可能なスクリプト

 ?未満は、PHPが/ ** *このファイルには、対象とする* *含まれているの@ authorロイドワトキン* @以降2009/12/23 * /抽象クラス題目{抽象的なパブリック関数addObserver(オブザーバー$オブザーバ);抽象的なパブリック関数removeObserver(オブザーバー$オブザーバ);抽象的なパブリック関数updateObserversは、($ newsHeadline);} / ** *これは、例えば*の対象とするクラスです@著者ロイドワトキンは、* @ /クラス2009/12/23 *以来ArticleAggregatorは、Subject {/ ** *保持を拡張する我々のオブザーバー*の* @のリストは、var配列* /保護$ _observerList =配列(); / ** *メソッドは* * @ VARのオブザーバー$オブザーバ* @戻り値はvoid * /パブリック関数addObserver(オブザーバー$オブザーバー)オブザーバを追加する{の$ this -> _observerList []は、= $オブザーバ;} / ** *メソッドは、*オブザーバを削除するには、@ VARのオブザーバー$オブザーバ* @戻り値ブール* /パブリック関数removeObserver(オブザーバー$オブザーバー){foreachの(の$ this -> {($ローテンブルク== $オブザーバ){unsetは(の$ this -> _observerList [キードル]の場合)はtrueを返す;}} $のAS _observerListキーが=)のOBドル> falseを返す} / ** *メソッドは、オブザーバーを更新する* * @ VARの文字列$ newsHeadline * @戻り値はvoid * /パブリック関数updateObservers($ newsHeadline){foreachの(の$ this -> _observerList $のASと略します){$ローテンブルク->更新プログラム($ newsHeadline);}} / ** *追加新しいニュースストーリー*の*は@ var文字列$物語* @戻り値はvoid * /パブリック関数addNewsStory($物語){(空($話は)|!| IS_STRING型($物語))は{ニュースを期待される新しいInvalidArgumentExceptionを('スローストーリー');}の$ this -> updateObservers($物語);}} 

コントローラスクリプト

 する<?PHPの
 / **
  *オブザーバデザインパターンの例
  *
  * @著者ロイドワトキン
  2009/12/23 @以降*
  * @リンクhttp://www.evilprofessor.co.uk
  * /
 'observers.php'を含める;
 'subject.php'を含める;

するif(!空($ _SERVER ['HTTP_USER_AGENTに'])){
     'エコー
  ';
 }

 / /我々は何をしているの?
エコー'PHPのObserverパターンの例。  PHP_EOL;
 '================================'エコー。  PHP_EOL;
 /私たちのテーマ/設定
 $件名=新しいArticleAggregator();
エコー' - ArticleAggregatorを作成。  PHP_EOL;

 / /いくつかのオブザーバーを追加する
 $主題> addObserver(新しいNewsObserver());
 $主題> addObserver($兎耳=新しいGossipObserver());

エコー' - NewsObverser&GossipObserver追加。
	  PHP_EOL。  PHP_EOL;

 / /ビープ、ビープ、ビープ音が... ニュースフラッシュ!
エコー'ニュースフラッシュ:有名人のラグビー選手は、金融が大好き。  PHP_EOL;
 '================================================エコー'。  PHP_EOL;
 $主題> addNewsStory(有名人のラグビー選手は、金融を愛している');
 PHP_EOLエコー;

エコー' - SportObserverが出て発見したグループに参加したい!';
 $主題> addObserver(新しいSportObserver());
 PHP_EOLエコー。  PHP_EOL;

 / /ビープ、ビープ、ビープ音が... ニュースフラッシュ!
エコー'ニュースフラッシュ:政府が再び台無しに!   PHP_EOL;
 '======================================='エコー。  PHP_EOL;
 $主題> addNewsStoryは('政府が再び台無し!');
 PHP_EOLエコー;

 / /ビープ、ビープ、ビープ音が... ニュースフラッシュ!
エコー'ニュースフラッシュ:ファッションやサッカーを組み合わせる。  PHP_EOL;
 '======================================='エコー。  PHP_EOL;
 $主題> addNewsStory('、ファッションやサッカー組み合わせ');
 PHP_EOLエコー;

 / /ビープ、ビープ、ビープ音が... ニュースフラッシュ!
 ':音楽と政治を、どのような次のニュースフラッシュ?'エコー   PHP_EOL;
 '=========================================='エコー。  PHP_EOL;
 $主題> addNewsStory('音楽と政治、次に何を?');
 PHP_EOLエコー;

 / **
  * Gossipersは、非常に迅速にニュースの疲れ成長決めました
  *今日はすべての興味深いニュースにもかかわらず、リッスンを停止する!
  * /
エコー' - GossipObserverは退屈され、グループを脱退! 
      PHP_EOL。  PHP_EOL;
 $主題> removeObserver($兎耳);

 / /ビープ、ビープ、ビープ音が... ニュースフラッシュ - 更新以前の話に!
エコー'NewsUpdate:ファッション、サッカー組み合わせて言う。
      '政府'。  PHP_EOL;
 '================================================エコー'。
      '========='。  PHP_EOL;
 $主題> addNewsStoryは('、ファッションやサッカーの組み合わせ。
                         )'、政府が言う';
 PHP_EOLエコー;

するif(!空($ _SERVER ['HTTP_USER_AGENTに'])){
     'エコー 

';

}

"デザインパターンをPHPの - オブザーバーパターン"3つの応答

  1. 誓いの 言葉:

    こんにちは、
    まず、私は英語をして、非常に貧しい
    あなたは、画像内のシステムは何かを教えてもらえますか?
    Fedora 12の?
    テーマは何ですか?

  2. 誓いの 言葉:

    こんにちは、
    あなたは、画像内のシステムは何かを教えてもらえますか?
    Fedora 12の?
    テーマは何ですか?

返信コメントを残す













パノラマテーマ別 Themocracy

6人オンライン中
5名、1ボット、0人のメンバー
今日の最大の訪問者は:11 1時06分でUTC午前
今月:22 2011年8月6日12時半は、UTCの午前
今年:130 28-03-2011 22:40 UTCに
すべての時間:130 28-03-2011 22:40 UTCに