PHPのデザインパターン- Observerパターン
私が読んできたHead Firstデザインパターンを 最近、私自身の利益のためにPHPの例としていくつかのパターンを書き込むことにしました。 私がコードすることを決定したので最初のものは、 Observerパターン 。 Observerパターンの正式な定義は次のとおりです。
Observerパターンは、(非同期のサブセットは、 パターンをパブリッシュ/サブスクライブ )であるソフトウェアの デザインパターンのオブジェクト 、主題と呼ばれる、通常は呼び出すことで、オブザーバーと呼ばれる、その依存のリストを保持し、任意の状態の変更を自動的に通知する彼らの一つの方法 。 それは主に、分散イベント処理システムを実装するために使用されます。
システムとしてより緩やかにイベントが発生したときにこれらの更新プログラムの知識を必要とするすべてのシステムに通知されていることを確認して結合され。 たとえば、ブログ記事、投稿を保存した後に我々が検索エンジン(例:Luceneを)更新する必要があります、私たちのサイトマップ、タグ、電子メール購読しているユーザ、等を更新Observerパターンは、開発者が被監視オブジェクトを編集せずに追加のリスナーを追加することができます。 サブジェクト(つまりブログ記事編集システム)にオブザーバー(つまり、検索エンジンのアップデートオブザーバ、サイトマップ生成、など)を注入することにより、我々はそれが変更することなくすべての必要な更新を実行できるようにすることができます。
Observerパターンが識別される前に通常のトリックが必要なシステムを更新するために追加のコード行で観察可能なオブジェクトを更新することです、そして必要に応じてコードの行を削除。 これは簡単にオブザーバーを追加および削除を許可しません。
updateメソッドを経由して対象の更新プログラムすべてのオブザーバにそのことを。 このupdateメソッドは、インタフェースを実装から派生されている各オブザーバのメソッドを呼び出します。 オブザーバーは、観察可能なオブジェクトのメソッドを介して自分自身を削除追加することができます。
それは基本的にはこれだけです! 私はいつもの例は、そう、ここは私のコード化された上の例の学習/理解する最善の方法であることがわかりました...
でObserverパターンPHP
私の例では私が小さいのニュースフィードにニュースの見出しの更新を送信するニュースシステム(NewsAggregator)を作成しました。 ニュースは、 オブザーバーやリスナーの役割を担う供給するのに対し、ここにニュースのsytemは、 サブジェクトの代わりに、 監視可能 、などをとります。
彼らが適しているように一度初期化のオブザーバーは、対象から自分自身をアタッチおよびデタッチできます。 私の例では私は3つのオブザーバーを作成して、これらは主題によって送信されるヘッドラインを読むことができ、必要に応じてニュースを"叫ぶ"。 threeオブザーバーは、彼らがニュースの見出しを受信したときにスキャン条件と一緒に下記の名前が付けられています。
- スポーツオブザーバー:'ラグビー'、'サッカー'、'テニス"
- ニュースオブザーバー:"政治"、"金融"、"政府"
- ゴシップオブザーバー:'有名人'、'音楽'、'ファッション'
件名をinitalising後、私はニュースやゴシップのオブザーバーを追加し、ニュースの更新を送信します。 より多くのニュースの更新が送信される前にこの後にスポーツオブザーバが追加されます。 最後のニュースの見出しが送信される前に最後にゴシップオブザーバは削除されます。
つの異なるオブザーバクラスはインタフェースObserver を実装し、これは彼らには更新を受信するときに使用される明確なインタフェース/メソッドを提供します。 彼らは件名に自分自身を添付できるようになるObserverインターフェイスを実装して提供。 また、これはプログラミングパラダイムの"インタフェースではない実装にプログラム'で続けます。 NewsAggregatorのクラスは、次の3つの必須のパブリックメソッドを持つ私たちを提供する抽象クラスの件名を 、拡張しています。
- updateObservers()
- addObserver()
- removeObserver()
コードは、ここで実行している見ることができるPHPのObserverパターンは、実行 、およびコードは、ここからダウンロードすることができるPHPのコードでObserverパターン 。
オブザーバースクリプト
<?PHP / ** *このファイルにはオブザーバーが含まれています * * @著者ロイドワト * @ 2009年12月23日以降 * / 抽象クラスの件名 { 抽象的なパブリック関数のaddObserver(オブザーバー$オブザーバー)。 抽象的なパブリック関数のremoveObserver(オブザーバー$オブザーバー)。 抽象的なパブリック関数のupdateObservers($ newsHeadline); } / ** *これは例のための主題クラスです。 * * @著者ロイドワト * @ 2009年12月23日以降 * / クラスArticleAggregatorは、件名に拡張 { / ** *私たちのオブザーバーのリストを保持します。 * * @ VARの配列 * / 保護された$ _observerList =配列(); / ** *オブザーバを追加する方法 * * @ VARオブザーバー$オブザーバー * @ voidを返す * / パブリック関数のaddObserver(オブザーバー$オブザーバー) { で$ this -> _observerList [] = $オブザーバー; } / ** オブザーバを削除する*方法 * * @ VARオブザーバー$オブザーバー * @戻りブール * / パブリック関数のremoveObserver(オブザーバー$オブザーバー) { foreachの(の$ this -> _observerList AS $キー=> $ OB){ 場合($ OB == $オブザーバー){ するunset($この - > _observerList [$キー]); trueを返します。 } } falseを返します。 } / ** オブザーバーを更新する*方法 * * @ VARの文字列$ newsHeadline * @ voidを返す * / パブリック関数のupdateObservers($ newsHeadline) { foreachの(の$ this -> _observerList AS $ OB){ $ OB ->更新($ newsHeadline); } } / ** *新しいニュース記事を追加 * * @ VAR文字列$話 * @ voidを返す * / パブリック関数のaddNewsStory($話) { 場合(空($建て)| |!IS_STRING($階)){ 新しいInvalidArgumentExceptionを('!ニュース記事を期待される")をスローします。 } の$ this -> updateObservers($話); } }
件名/観測可能なスクリプト
<?PHP / ** *このファイルには、主題が含まれています * * @著者ロイドワト * @ 2009年12月23日以降 * / 抽象クラスの件名 { 抽象的なパブリック関数のaddObserver(オブザーバー$オブザーバー)。 抽象的なパブリック関数のremoveObserver(オブザーバー$オブザーバー)。 抽象的なパブリック関数のupdateObservers($ newsHeadline); } / ** *これは例のための主題クラスです。 * * @著者ロイドワト * @ 2009年12月23日以降 * / クラスArticleAggregatorは、件名に拡張 { / ** *私たちのオブザーバーのリストを保持します。 * * @ VARの配列 * / 保護された$ _observerList =配列(); / ** *オブザーバを追加する方法 * * @ VARオブザーバー$オブザーバー * @ voidを返す * / パブリック関数のaddObserver(オブザーバー$オブザーバー) { で$ this -> _observerList [] = $オブザーバー; } / ** オブザーバを削除する*方法 * * @ VARオブザーバー$オブザーバー * @戻りブール * / パブリック関数のremoveObserver(オブザーバー$オブザーバー) { foreachの(の$ this -> _observerList AS $キー=> $ OB){ 場合($ OB == $オブザーバー){ するunset($この - > _observerList [$キー]); trueを返します。 } } falseを返します。 } / ** オブザーバーを更新する*方法 * * @ VARの文字列$ newsHeadline * @ voidを返す * / パブリック関数のupdateObservers($ newsHeadline) { foreachの(の$ this -> _observerList AS $ OB){ $ OB ->更新($ newsHeadline); } } / ** *新しいニュース記事を追加 * * @ VAR文字列$話 * @ voidを返す * / パブリック関数のaddNewsStory($話) { 場合(空($建て)| |!IS_STRING($階)){ 新しいInvalidArgumentExceptionを('!ニュース記事を期待される")をスローします。 } の$ this -> updateObservers($話); } }
コントローラスクリプト
<?PHP / ** * Observerデザインパターンの例 * * @著者ロイドワト * @ 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、エコーPHP_EOL;主題> addNewsStory('有名人ラグビー選手は金融大好き"を)$エコー" - 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'])){echo'この';
}


















































こんにちは、
最初に、私の英語はその後、非常に貧弱です。
この写真のシステムが何であるか教えてもらえますか?
フェドーラ12?
テーマは何ですか?
こんにちは、
この写真のシステムが何であるか教えてもらえますか?
Fedora 12の?
テーマは何ですか?
KDEとのフェドーラ11適用。 私は信じてテーマをGlasslooks。