HTTP/1.0 200 OK Accept-Ranges: none Content-Location: http://www.evilprofessor.co.uk/211-php-design-patterns-observer-pattern/ Content-Type: text/html; charset=UTF-8 Date: Thu, 19 May 2011 01:06:43 GMT X-Frame-Options: ALLOWALL Set-Cookie: PREF=ID=3466f40b635fc675:TM=1305767203:LM=1305767204:S=xIVttN5jo80PIVZX; expires=Sat, 18-May-2013 01:06:44 GMT; path=/; domain=translate.googleusercontent.com X-Content-Type-Options: nosniff Server: translation Expires: Thu, 19 May 2011 01:06:43 GMT Cache-Control: private Evilprofessor.co.uk »PHP Design Patterns - Observer Pattern

PHP Design Patterns - Observer Pattern

Tarafından Steven Lloyd Watkin Salı 29 Aralık 2009 22:02

Ben okuma oldum Head First Design Patterns Yakın zamanda ve kendi yararına PHP örnek olarak kalıplarının bazı yazmaya karar verdim. kod kadar ilk karar verdim ben bir olduğunu Observer Pattern . Observer Pattern biçimsel tanımı:

Gözlemci deseni (asenkron bir alt model yayınlamak abone / ) bir yazılım tasarım modeli olan bir nesne olarak adlandırılan konu, gözlemci olarak adlandırılan bakmakla sağlayan bir liste onun ve arayarak, genellikle herhangi bir devlet değişikliklerin otomatik olarak bildirir onların bir yöntem . Temelde dağıtılan olay işleme sistemlerinin uygulanması için kullanılır.

haline sistemleri daha gevşek bir olay bu güncelleştirmeler hakkında bilgi haberdar gerektiren tüm sistemler olduğunda emin birleştiğinde gibi. Örneğin, bir blog yazısı, bir yazı kaydettikten sonra biz, bir arama motoru (Lucene gibi) güncelleştirme gerekebilir vb gözlemci desen bizim site haritası, etiketleri, e-posta abone kullanıcılar, güncelleştirme geliştiriciler düzenleme olmadan kendi gözlemlenebilir nesne ek dinleyici eklemenizi sağlar . Gözlemciler enjekte derken, herhangi bir değişiklik olmadan tüm gerekli güncellemeleri gerçekleştirmek için izin verebilir bir konu (örneğin blog yazısı düzenleme sistemi) içine (bir arama motoru güncelleme gözlemci, bir site haritası jeneratör, vs gibi).

Observer desen, her zamanki hile gerekli sistem güncellemek için kod ek bir hat ile gözlemlenebilir nesne güncelleme olacağını tespit edilmiştir öncesi ve kod satırını kaldırarak gerektiği gibi. Bu kolaylıkla ekleme ve çıkarma gözlemcilere izin vermez.

Konu güncellemeleri bir güncelleştirme yöntemi ile onun gözlemci tüm. Bu güncelleştirme metodu bir arayüz uygulama türetilmiştir her gözlemci bir yöntemini çağırır. Gözlemci bir gözlemlenebilir nesnesinde yöntemlerle kendilerini kaldırmak ekleyebilirsiniz.

Bu temelde bu! Ben her zaman bir örnek / yüzden burada anlayış benim kadar kodlanmış örnek öğrenmenin en iyi yöntem olduğu için bulmak ...

Desen Observer PHP

örnekte benim ben beslemeleri haberleri haber başlık güncellemeler için küçük ettik gönderir (NewsAggregator) sistemi haber oluşturulan bir. Burada haber sytem Dinleyicileri gözlemciler veya vb ise haber beslemeleri rol almak, Gözlemlenebilir Konu, alır yer.

Bir kez başlatıldığını gözlemci ekleyebilir ve uygun gördükleri gibi konu kendilerini ayırmak. Benim örnekte ben manşetlere konu tarafından gönderilen tarama bu ve uygunsa haber 'not' üç gözlemci, yarattık. Üç gözlemci için aşağıdaki boyunca terimler ile bunların tarama adlandırılır zaman alan haber başlıkları:

  • Spor Observer: 'rugby', 'futbol', 'tenis'
  • Haber Observer: 'siyaset', 'finans', 'hükümet'
  • Dedikodu Observer: 'ünlü', 'müzik', 'moda'

konu initalising sonra haber ve dedikodu gözlemciler ekleyin ve bir haber güncelleme göndermek. Daha fazla haber güncellemeleri dışarı gönderilmeden önce bu sonra spor gözlemci eklenir. son bir haber başlığı dışarı gönderilmeden önce Son dedikodu gözlemci kaldırılır.

Üç farklı gözlemci sınıflar Observer uygulamak arabirimi, bu güncellemeleri veren onları açık bir arayüz üzerinden yöntem alacaksınız onlar. Tabi olmak üzere, takmak kendileri için onlar mümkün olacak onlar arayüzü Observer uygulamak. Bu da 'arayüzleri değil uygulamalarına programın programlama paradigması ile devam ediyor. NewsAggregator sınıf yöntemleri ile üç gerektirdiği kamu uzanır bize sağlayan soyut sınıf Konu:

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

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

Gözlemci Script

  <? Php
 / **
  * Bu dosya gözlemci içeren
  *
  * @ Author Lloyd Watkin
  2009/12/23 @ yana *
  * /

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

 / **
  * Bu örneğin konu sınıf
  *
  * @ Author Lloyd Watkin
  2009/12/23 @ yana *
  * /
 sınıf ArticleAggregator Konu genişletir
 {
	 / **
	  * Bizim gözlemcilerin listesini tutar
	  *
	  * @ Var array
	  * /
	 korunan $ _observerList = array ();

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

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

	 / **
	  * Yöntem gözlemciler güncelleme
	  *
	  * @ Var string $ newsHeadline
	  * @ Return void
	  * /
	 public function updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> ob $ AS _observerList) {
			 $ Ob-> güncelleme ($ newsHeadline);
		 }
	 }

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

Konu / Gözlemlenebilir Script

 Php / ** * Bu dosya konu * içerir @ author Lloyd Watkin * @ beri 2009/12/23 * / soyut sınıf Konu {soyut public function addObserver (Gözlemci $ gözlemci); soyut public function removeObserver (Gözlemci $ gözlemci ); soyut kamu işlevi updateObservers ($ newsHeadline);} / ** * Bu örnekte * için konu sınıf @ yazar Lloyd Watkin * @ / sınıf 2009/12/23 * beri ArticleAggregator Konu {/ ** * tutar uzatır bizim gözlemci * @ listesi var dizi * / protected $ _observerList = array (); / ** * Yöntem * * @ var Gözlemci $ gözlemci * @ return void * / public function addObserver (Gözlemci $ gözlemci) bir gözlemci eklemek {$ this-> _observerList [] = $ gözlemci;} / ** * Yöntem * gözlemci kaldırmak için @ var Gözlemci $ gözlemci * @ return boolean * / public function removeObserver (Gözlemci $ gözlemci) {foreach ($ this-> {($ ob == $ gözlemci) {unset ($ this-> _observerList [anahtar $] ise); return true;}} $ AS _observerList anahtar =) ob $> return false;} / ** * Yöntem gözlemciler güncelleme * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList $ AS ob) {$ ob-> güncelleme ($ newsHeadline);}} / ** * ekle Yeni bir haber * * @ var string $ hikaye * @ return void * / public function addNewsStory ($ hikaye) {(empty ($ hikaye) | | is_string ($ hikaye)) {if bir haber Beklenen yeni InvalidArgumentException ('atmak hikaye ');!} $ this-> updateObservers ($ hikaye);}} 

Kontrolör Script

  <? Php
 / **
  * Observer Desen tasarım Örneği
  *
  * @ Author Lloyd Watkin
  2009/12/23 @ yana *
  * @ Link http://www.evilprofessor.co.uk
  * /
 'Observers.php' de;
 'Subject.php' de;

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

 / / Ne yapıyoruz?
 echo 'PHP'de Observer Pattern Örneği'.  PHP_EOL;
 '================================' Yankı.  PHP_EOL;
 / Bizim konu / ayarlama
 $ Subject = new ArticleAggregator ();
 echo '- ArticleAggregator oluşturdu.  PHP_EOL;

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

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

 / / Bip, bip, bip ...  Flaş haber!
 echo 'Haber: ünlü rugby oyuncusu finans seviyor.  PHP_EOL;
 '================================================ Yankı '.  PHP_EOL;
 $ Konu-> addNewsStory ('ünlü rugby oyuncusu finans seviyor');
 PHP_EOL yankı;

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

 / / Bip, bip, bip ...  Flaş haber!
 echo 'Haber: Hükümet yine İşleri berbat!'  .  PHP_EOL;
 '=======================================' Yankı.  PHP_EOL;
 $ Konu-> addNewsStory ('Hükümet yine İşleri berbat!');
 PHP_EOL yankı;

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

 / / Bip, bip, bip ...  Flaş haber!
 ': Müzik ve siyaset, ne gelecek Haber? Echo'  .  PHP_EOL;
 '==========================================' Yankı.  PHP_EOL;
 $ Konu-> addNewsStory ('müzik ve siyaset, ne gelecek?');
 PHP_EOL yankı;

 / **
  * Gossipers ve çok hızlı bir şekilde haber yorgun büyümeye karar verdik
  * Bugün bütün ilginç haber rağmen, dinlemeyi durdurmak için!
  * /
 echo '- GossipObserver sıkılmış ve grup yaprakları!'  .
      PHP_EOL.  PHP_EOL;
 $ Konu-> removeObserver ($ gossiper);

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

 if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     Echo ' 

';

}

"Design Patterns PHP - Observer Pattern" için 3 yanıt

  1. Yemin diyor ki:

    Merhaba,
    İlk, İngilizcem sonra, çok kötü
    Resimde sistemin ne olduğunu bana söyleyebilir misiniz?
    Fedora 12?
    tema nedir?

  2. Yemin diyor ki:

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

Bir Yanıt bırak













Panorama Tema tarafından Themocracy

10 ziyaretçi online şimdi
8 ziyaretçi, 2 bot, 0 üye
Max ziyaretçi bugün: 17 00:28 'de UTC am
Bu ay: 26 de 2011/07/05 12:35 UTC am
Bu yıl: 130 28-03-2011 22:40 UTC
Tüm zamanların: 130 28-03-2011 10:40 UTC