PHP Design Patterns - Observer Pattern

By Salı, 29 Aralık 2009 22:02

Ben okuma oldum Head First Design Patterns Kısa bir süre önce kendi yararı için PHP örnek olarak bazı desenler yazmaya karar verdik. Ben yazmaya karar verdik ki İlki Observer Pattern . Observer Pattern resmi tanımı:

Gözlemci deseni (asenkron bir alt desen yayınlama / abone ) bir yazılım tasarım deseni olan bir nesne , konu olarak adlandırılan gözlemci olarak adlandırılan, onun bakmakla yükümlü olduğu bir listesini tutar ve genellikle arayarak, herhangi bir devlet değişiklikleri otomatik olarak bildirir kendi yöntemleri . Özellikle dağıtılmış olay işleme sistemleri uygulamak için kullanılır.

Sistemleri hale geldikçe daha gevşek emin bir olay bu güncellemeleri bilgidir gerektiren tüm sistemler olduğunda bu karar birleştiğinde. Örneğin, bir blog yazısı, bir mesajı kaydettikten sonra (örneğin Lucene) bir arama motoru güncelleştirme gerekebilir gözlemci desen, geliştiricilerin kendi gözlemlenebilir bir nesne düzenleme olmadan ek dinleyici eklemenize izin verir, site haritası, etiketleri, e-posta abone kullanıcılar, vb güncelleme . Gözlemci (yani bir arama motoru güncellemesi gözlemci, bir site haritası jeneratör, vb) bir konu (örneğin, bir blog yazısı düzenleme sistemi) içine enjekte edilerek biz herhangi bir değişiklik olmadan, tüm gerekli güncellemeleri yapmak için izin verebilirsiniz.

Observer desen saptanmıştır önce her zamanki hile gerekli sistem güncellemek için ek bir satır kod ile gözlemlenebilir bir nesne güncelleme olacağını ve gerektiği gibi kod satırını kaldırarak. Bu gözlemciler kolayca ekleme ve çıkarma için izin vermez.

Bir güncelleştirme yöntemi ile konu güncellemeleri tüm gözlemcilerin. Bu güncelleştirme yöntemi bir arayüz uygulanması türetilmiştir her gözlemci bir yöntem çağırır. Gözlemciler gözlemlenebilir bir nesne yöntemlerle kendilerini kaldırmak ekleyebilirsiniz.

Bu temelde bu! Ben her zaman bir örnek öğrenme / anlama en iyi yöntem, bu nedenle burada benim kodlu kadar örnek olması için bulabilirsiniz ...

Observer Pattern PHP

Benim örnekte ben küçük haber beslemeleri haber başlığı güncellemeleri gönderen bir haber sistemi (NewsAggregator) yarattık. Gözlemciler veya Dinleyiciler rol almak haber beslemeleri ise haber Sytem Konu yeri, Gözlenebilir, vb alır.

Uygun gördükleri bir kez ilklendirilmiş gözlemciler, kendilerini bu konuda eklemek ve ayırabilirsiniz. Benim örnekte ben haber uygunsa, üç gözlemci, bu tarama konuda tarafından gönderilen başlıkları ve 'çığlık' oluşturduk. Üç gözlemci, haber başlıkları alırken tarama açısından ile birlikte aşağıdaki adlandırılır:

  • Spor Observer: 'rugby', 'futbol', 'tenis'
  • Haberler Observer: 'siyaset', 'finans', 'hükümet'
  • Gossip Observer: 'celebrity', 'müzik', 'moda'

Konu initalising sonra haber ve dedikodu gözlemciler ekleyin ve bir güncelleştirme haber göndermek. Bundan sonra daha fazla haberler, güncelleştirmeler gönderilmeden önce spor gözlemci eklenir. Son bir haber başlığı gönderilmeden önce son olarak dedikodu gözlemci kaldırılır.

Üç farklı gözlemci sınıflar arabirim Gözlemci uygulamak, bu onları güncellemeleri alacağı net bir arabirim / yöntem verir. Konu kendilerini eklemek mümkün olacak Observer arayüzü uygulamak sağlanmıştır. Bu aynı zamanda 'arayüzleri değil uygulamaları programı' programlama paradigması ile tutar. NewsAggregator sınıfı soyut sınıf Konu, gerekli üç genel yöntemleri ile bize sunuyor genişletir:

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

Bu kod, burada çalışan görülebilir Observer Pattern PHP Koşu ve kodu, buradan indirebilirsiniz PHP Kod Observer Pattern .

Gözlemci Senaryo

  <? Php
 / **
  * Bu dosya gözlemciler
  *
  * @ Yazar Lloyd Watkin
  * @ 2009/12/23 beri
  * /

 soyut bir sınıf Konu
 {
	 soyut public function addObserver (Observer $ gözlemci);
	 soyut public function removeObserver (Observer $ gözlemci);
	 soyut public function updateObservers ($ newsHeadline);
 }

 / **
  * Bu, örneğin, söz konusu sınıf
  *
  * @ Yazar Lloyd Watkin
  * @ 2009/12/23 beri
  * /
 sınıf ArticleAggregator Konu uzatır
 {
	 / **
	  * Gözlemcilerin listesini tutar.
	  *
	  * @ Var array
	  * /
	 protected $ _observerList = array ();

	 / **
	  * Bir gözlemci eklemek için Yöntemi
	  *
	  * @ Var Observer $ gözlemci
	  * @ Return void
	  * /
	 public function addObserver (Observer $ gözlemci)
	 {
		 $ This-> _observerList [] = $ gözlemci;
	 }

	 / **
	  * Bir gözlemci kaldırmak için Yöntemi
	  *
	  * @ Var Observer $ gözlemci
	  * @ Return boolean
	  * /
	 public function removeObserver (Observer $ gözlemci)
	 {
		 foreach ($ this-> _observerList AS $ anahtar => $ ob) {
			 if ($ ob == $ gözlemci) {
				 unset ($ this-> _observerList [$ anahtar]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Gözlemci güncelleme Yöntemi
	  *
	  * _AT_ Var dize $ newsHeadline
	  * @ Return void
	  * /
	 public function updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> update ($ newsHeadline);
		 }
	 }

	 / **
	  * Yeni bir haber ekle
	  *
	  * @ Var dize $ hikaye
	  * @ Return void
	  * /
	 public function addNewsStory (hikaye)
	 {
		 if (empty ($ hikaye) | |! is_string ($ hikaye)) {
			 Yeni InvalidArgumentException (! bir haber Beklentisi ') atmak;
		 }
		 $ This-> updateObservers (hikaye);
	 }
 } 

Gözlenebilir / Konu Komut

 <? Php / ** * Bu dosya konusu içerir * * @ author Lloyd Watkin * * / soyut sınıf Konu {soyut public function addObserver (Gözlemci $ gözlemci); soyut public function removeObserver (Observer $ @ 2009/12/23 bu yana gözlemci ); soyut public function updateObservers ($ newsHeadline);} / ** * Bu, örneğin, söz konusu sınıf * * @ author Lloyd Watkin * @ 2009/12/23 beri * / class ArticleAggregator Konu uzanır {/ ** * tutar bizim gözlemcilerin listesini * * @ var dizi * / korumalı _observerList = array (); / ** * Bir gözlemci eklemek için Yöntemi * * @ var Observer doları gözlemci * @ return void * / public function addObserver (Observer $ gözlemci) {$ this-> _observerList [] = ABD doları gözlemci;} / ** * Bir gözlemci kaldırmak için Yöntemi * * @ var Observer doları gözlemci * @ return boolean * / public function removeObserver (Gözlemci $ gözlemci) {if ($ this-> _observerList AS $ anahtar => $ ob) {olmuştur unset ($ this-> _observerList [$ anahtar]) {if ($ ob == $ gözlemci); return true;}} return false;} / ** * gözlemciler güncellemek için Yöntemi * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update (newsHeadline);}} / ** * yeni bir haber * * @ var dize doları hikaye * @ return void * / public function addNewsStory (hikaye) {if (empty ($ hikaye) | |! is_string (hikaye)) {('Beklenen bir haber yeni InvalidArgumentException atmak hikayesi ');} $ this-> updateObservers (hikaye);}} 

Kontrolör Senaryo

  <? Php
 / **
  * Gözlemci Tasarım Model Örneği
  *
  * @ Yazar Lloyd Watkin
  * @ 2009/12/23 beri
  * @ Bağlantı http://www.evilprofessor.co.uk
  * /
 'observers.php' içerir;
 'subject.php' içerir;

 if (empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo '
  ';
 }

 / / Biz ne yapıyoruz?
 echo 'PHP Observer Pattern Örneği'.  PHP_EOL;
 '================================' yankı.  PHP_EOL;
 / / Konu
 $ Subject = new ArticleAggregator ();
 echo '- ArticleAggregator oluşturduk.  PHP_EOL;

 / / Bazı gözlemciler
 $ Konu> addObserver (yeni NewsObserver ());
 $ Konu> addObserver ($ Gossiper = new GossipObserver ());

 echo '- NewsObverser & GossipObserver Eklendi.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Flaş Haber!
 echo 'Flaş Haber: ünlü ragbi oyuncu finans seviyor.  PHP_EOL;
 '================================================ yankı .  PHP_EOL;
 $ Konu> addNewsStory ('ünlü ragbi oyuncu finans seviyor');
 echo PHP_EOL;

 echo '- SportObserver bulundu ve gruba katılmak istiyor!';
 $ Konu> addObserver (yeni SportObserver ());
 echo PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Flaş Haber!
 echo 'Flaş Haber: tekrar hükümet Messes!'  .  PHP_EOL;
 '=======================================' yankı.  PHP_EOL;
 $ Konu> addNewsStory ('tekrar hükümet işler karışıyor!');
 echo PHP_EOL;

 / / Bip, bip, bip ...  Flaş Haber!
 echo 'Flaş Haber: moda ve futbol birleştirmek'.  PHP_EOL;
 '=======================================' yankı.  PHP_EOL;
 $ Konu> addNewsStory ('moda ve futbol kombine');
 echo PHP_EOL;

 / / Bip, bip, bip ...  Flaş Haber!
 echo 'Flaş Haber: Bir sonraki müzik ve siyaset, ne olacak?'  .  PHP_EOL;
 '==========================================' yankı.  PHP_EOL;
 $ Konu> addNewsStory ('müzik ve siyaset, sırada ne var?');
 echo PHP_EOL;

 / **
  * Dedikoducu, haber çok çabuk yorulur ve karar
  * Bugün tüm ilginç haber rağmen, dinleme durdurmak için!
  * /
 echo '- GossipObserver sıkılmış ve grup yaprakları!'  .
      PHP_EOL.  PHP_EOL;
 $ Konu> removeObserver ($ Gossiper);

 / / Bip, bip, bip ...  Flaş Haber - Güncelleme önceki bir hikaye!
 echo 'NewsUpdate: moda ve futbol kombine diyor'.
      'Hükümet'.  PHP_EOL;
 '================================================ yankı .
      '========='.  PHP_EOL;
 $ Konu> addNewsStory ('moda ve futbol birleştirmek'.
                         ) 'Hükümet diyor ki;
 echo PHP_EOL;

 if (empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo ' 

';

}

3 Responses to "PHP Design Patterns - Observer Pattern"

  1. Vow diyor:

    Merhaba,
    Öncelikle, My ingilizce, sonra çok kötü
    Resmi sistemin ne olduğunu bana söyleyebilir misiniz?
    fedora 12?
    Tema nedir?

  2. Vow diyor:

    Merhaba,
    Resmi sistemin ne olduğunu bana söyleyebilir misiniz?
    Fedora 12?
    Tema nedir?

Bir Cevap Yazın













Panorama Tema al Themocracy

Şu anda 10 ziyaretçi çevrimiçi
3 misafir, 7 botlar, 0 üye
Bugün Max ziyaretçiler: 12:12 15 UTC
Bu ay: 01-09-2011 11:27 UTC de 17
Bu yıl: 130 28-03-2011 22:40 UTC
Bütün Zaman: 28-03-2011 10:40 UTC de 130