PHP Disinji Disinn - Pattern Osservatur

Permezz , it-Tlieta 29 Diċembru, 2009 22:02

Stajt ġiet qari Disinji Kap tad-Disinn Ewwel reċentement u ikunu iddeċidew li jikteb xi wħud mill-mudelli bħala eżempji PHP għall-benefiċċju personali tiegħi. L-ewwel waħda li jien iddeċidejt li kodiċi up huwa l- Pattern Osservatur . Id-definizzjoni formali tal-Pattern Osservatur huwa:

Il-mudell osservatur (subsett ta 'l-mhux sinkroniku jippubblika / tabbona mudell ) huwa softwer mudell tad-disinn li fihom oġġett , imsejjaħ is-suġġett, iżomm lista ta 'dipendenti tagħha, imsejħa osservaturi, u tinnotifika b'mod awtomatiku ta' kwalunkwe bidliet istat, normalment billi ċċempel wieħed minn metodi . Dan huwa prinċipalment użat biex jimplimentaw is-sistemi distribwiti tqandil avveniment.

Bħala sistemi isiru aktar b'mod laxk flimkien jagħmlu ċert li meta l-avveniment jiġri l-sistemi li jeħtieġu għarfien ta 'dawn l-aġġornamenti huma infurmati. Per eżempju, blog post, wara l-iffrankar ta 'wara għandna jistgħu jeħtieġu li jiġu aġġornati search engine (eż. Lucene), taġġorna sitemap tagħna, tikketti, l-utenti email sottoskritt, eċċ Il-mudell osservatur tippermetti lill-iżviluppaturi li jżidu s-semmiegħa addizzjonali mingħajr editjar oġġett osservabbli tagħhom . Billi tinjetta l-osservaturi (jiġifieri search engine osservatur aġġornament, ġeneratur sitemap, eċċ) fis-suġġett (blog jiġifieri wara l-editjar sistema) nistgħu jippermettu l-li jwettaq l-aġġornamenti kollha meħtieġa mingħajr ebda tibdil.

Qabel il-mudell Osservatur ġiet identifikata l-trick soltu tkun li taġġorna l-oġġett osservabbli ma 'linja addizzjonali ta' kodiċi li jaġġorna s-sistema meħtieġa, u tneħħi l-linja tal-kodiċi kif meħtieġ. Din ma tippermettix faċilment żieda-tneħħija u l-osservaturi.

L-aġġornamenti kollha jkunu soġġetti ta 'osservaturi tagħha permezz ta' metodu ta 'aġġornament. Dan il-metodu aġġornament jitlob metodu f'kull osservatur li hija derivata mill-implimentazzjoni ta 'interface. Osservaturi jistgħu jżidu tneħħi lilhom infushom permezz ta 'metodi fil-oġġett osservabbli.

Dik hija bażikament it! Jien dejjem issib eżempju li tkun l-aħjar metodu ta 'tagħlim / fehim hekk hawnhekk eżempju kodifikati tiegħi sa ...

Pattern osservatur fil PHP

Fl-eżempju tiegħi stajt ħolqot sistema aħbarijiet (NewsAggregator) li tibgħat l-aġġornamenti headline aħbarijiet aħbarijiet għalf iżgħar. Hawnhekk il-sytem aħbarijiet jieħu l-post ta 'l-Suġġett, osservabbli, eċċ billi l-aħbarijiet għalf jieħdu r-rwol ta' l-osservaturi jew Semmiegħa.

Osservaturi darba jinbeda jistgħu jehmżu u jinqalgħu mis-suġġett kif jarawhom xierqa. Fl-eżempju tiegħi I ħolqu tliet osservaturi, dawn skennjati l-aħbarijiet li tintbagħat mill-suġġett u "jgħajtu" l-aħbarijiet jekk xieraq tagħha. L-osservaturi tlieta huma msemmija hawn taħt flimkien mat-termini li scan għal meta jirċievu aħbarijiet ewlenin:

  • Sport Osservatur: "rugby", "futbol", "tennis"
  • Osservatur Aħbarijiet: "politika", "finanzjament", "gvern"
  • Osservatur gossip: "ċelebrità", "mużika", "moda"

Wara initalising-suġġett I żid l-aħbarijiet u l-osservaturi gossip u jibgħat aġġornament aħbarijiet. Wara dan l-osservatur isport huwa miżjud qabel l-aġġornamenti iktar aħbarijiet ikunu ntbagħtu. Fl-aħħar nett l-osservatur gossip titneħħa qabel headline aħbarijiet finali mibgħut.

It-tliet klassijiet differenti osservatur timplimenta l-Osservatur-interface, dan jagħtihom metodu ċar interface / li permezz tagħhom huma se jirċievu aġġornamenti. Sakemm jimplimentaw l-interface Osservatur dawn se jkunu jistgħu jagħtu ruħhom għall-suġġett. Dan żżomm ukoll mal-mudell ta 'programmazzjoni ta' programm għall-interfaces ma implimentazzjonijiet ". Il-klassi NewsAggregator testendi l-Suġġett klassi astratt, li jagħtina l-tliet metodi pubbliċi huma mitluba:

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

Il-kodiċi jista 'jidher hawn taħdem, Pattern Osservatur fil-PHP Tmexxija , u l-kodiċi jista 'jitniżżel minn hawn, Pattern Osservatur fil-Kodiċi PHP .

Osservatur Script

  <? PHP
 / **
  * Dan il-fajl fih l-osservaturi
  *
  * @ Awtur Lloyd Watkin
  * @ Peress 2009/12/23
  * /

 Suġġett astratt klassi
 {
	 astratt pubbliku funzjoni addObserver (Osservatur osservatur $);
	 astratt pubbliku funzjoni removeObserver (Osservatur osservatur $);
	 astratt updateObservers pubbliku funzjoni ($ newsHeadline);
 }

 / **
  * Din hija l-klassi suġġett għall-eżempju
  *
  * @ Awtur Lloyd Watkin
  * @ Peress 2009/12/23
  * /
 ArticleAggregator klassi testendi Suġġett
 {
	 / **
	  * Stivi lista ta 'osservaturi tagħna
	  *
	  * @ Var firxa
	  * /
	 protetti $ _observerList = array ();

	 / **
	  * Metodu biex iżżid osservatur
	  *
	  * @ Var Osservatur $ osservatur
	  * Null ritorn @
	  * /
	 pubbliku funzjoni addObserver (Osservatur $ osservatur)
	 {
		 $ Dan il-> _observerList [] = $ osservatur;
	 }

	 / **
	  * Metodu biex jitneħħew osservatur
	  *
	  * @ Var Osservatur $ osservatur
	  * Boolean ritorn @
	  * /
	 pubbliku funzjoni removeObserver (Osservatur $ osservatur)
	 {
		 foreach ($ dan il-> _observerList KIF $ ewlenin => $ ob) {
			 jekk ($ ob == $ osservatur) {
				 mitfi ($ dan il-> _observerList [$ ewlenin]);
				 ritorn vera;
			 }
		 }
		 ritorn foloz;
	 }

	 / **
	  * Metodu biex taġġorna l-osservaturi
	  *
	  * @ Sekwenza var $ newsHeadline
	  * Null ritorn @
	  * /
	 updateObservers pubbliku funzjoni ($ newsHeadline)
	 {
		 foreach ($ dan il-> _observerList KIF $ ob) {
			 $ Ob> aġġornament ($ newsHeadline);
		 }
	 }

	 / **
	  * Żid storja aħbarijiet ġdida
	  *
	  * @ Sekwenza var $ istorja
	  * Null ritorn @
	  * /
	 pubbliku funzjoni addNewsStory ($ istorja)
	 {
		 jekk (vojta ($ storja) | |! is_string ($ storja)) {
			 tarmi InvalidArgumentException ġdid ("mistennija storja aħbarijiet!");
		 }
		 $ Dan il-> updateObservers ($ storja);
	 }
 } 

Suġġett / osservabbli Script

  <? PHP
 / **
  * Dan il-fajl fih is-suġġett
  *
  * @ Awtur Lloyd Watkin
  * @ Peress 2009/12/23
  * /

 Suġġett astratt klassi
 {
	 astratt pubbliku funzjoni addObserver (Osservatur osservatur $);
	 astratt pubbliku funzjoni removeObserver (Osservatur osservatur $);
	 astratt updateObservers pubbliku funzjoni ($ newsHeadline);
 }

 / **
  * Din hija l-klassi suġġett għall-eżempju
  *
  * @ Awtur Lloyd Watkin
  * @ Peress 2009/12/23
  * /
 ArticleAggregator klassi testendi Suġġett
 {
	 / **
	  * Stivi lista ta 'osservaturi tagħna
	  *
	  * @ Var firxa
	  * /
	 protetti $ _observerList = array ();

	 / **
	  * Metodu biex iżżid osservatur
	  *
	  * @ Var Osservatur $ osservatur
	  * Null ritorn @
	  * /
	 pubbliku funzjoni addObserver (Osservatur $ osservatur)
	 {
		 $ Dan il-> _observerList [] = $ osservatur;
	 }

	 / **
	  * Metodu biex jitneħħew osservatur
	  *
	  * @ Var Osservatur $ osservatur
	  * Boolean ritorn @
	  * /
	 pubbliku funzjoni removeObserver (Osservatur $ osservatur)
	 {
		 foreach ($ dan il-> _observerList KIF $ ewlenin => $ ob) {
			 jekk ($ ob == $ osservatur) {
				 mitfi ($ dan il-> _observerList [$ ewlenin]);
				 ritorn vera;
			 }
		 }
		 ritorn foloz;
	 }

	 / **
	  * Metodu biex taġġorna l-osservaturi
	  *
	  * @ Sekwenza var $ newsHeadline
	  * Null ritorn @
	  * /
	 updateObservers pubbliku funzjoni ($ newsHeadline)
	 {
		 foreach ($ dan il-> _observerList KIF $ ob) {
			 $ Ob> aġġornament ($ newsHeadline);
		 }
	 }

	 / **
	  * Żid storja aħbarijiet ġdida
	  *
	  * @ Sekwenza var $ istorja
	  * Null ritorn @
	  * /
	 pubbliku funzjoni addNewsStory ($ istorja)
	 {
		 jekk (vojta ($ storja) | |! is_string ($ storja)) {
			 tarmi InvalidArgumentException ġdid ("mistennija storja aħbarijiet!");
		 }
		 $ Dan il-> updateObservers ($ storja);
	 }
 } 

Kontrollur Script

  <? PHP
 / **
  * Osservatur disinn tal-mudell Eżempju
  *
  * @ Awtur Lloyd Watkin
  * @ Peress 2009/12/23
  * Http://www.evilprofessor.co.uk rabta @
  * /
 jinkludu "observers.php";
 jinkludu "subject.php";

 jekk (! vojta ($ _SERVER ["HTTP_USER_AGENT"])) {
     "eku
  ";
 }

 / / X'inhuma nagħmlu?
 eku "Osservatur Pattern Eżempju fil-PHP".  PHP_EOL;
 eku'================================'.  PHP_EOL;
 / / Twaqqaf suġġett tagħna
 $ Suġġett = ArticleAggregator ġodda ();
 eku "- ArticleAggregator maħluqa".  PHP_EOL;

 / / Żid ftit osservaturi
 $ Suġġett> addObserver (ġdid NewsObserver ());
 $ Suġġett> addObserver ($ gossiper = ġdid GossipObserver ());

 eku "- Added NewsObverser & GossipObserver".
	  PHP_EOL.  PHP_EOL;

 / / Ħoss,, ħoss ħoss ...  Aħbarijiet Flash!
 eku "Newsflash: ċelebrità tar-rugby attur tant iħobb finanzi".  PHP_EOL;
 eku'================================================ ".  PHP_EOL;
 $ Suġġett> addNewsStory ("ċelebrità tar-rugby attur tant iħobb finanzjament");
 eku PHP_EOL;

 eku "- SportObserver sab u trid li jingħaqdu mal-grupp!";
 $ Suġġett> addObserver (ġdid SportObserver ());
 eku PHP_EOL.  PHP_EOL;

 / / Ħoss,, ħoss ħoss ...  Aħbarijiet Flash!
 "Newsflash: il-gvern messijiet mill-ġdid!" eku  .  PHP_EOL;
 eku'======================================='.  PHP_EOL;
 $ Suġġett> addNewsStory ("messijiet tal-gvern mill-ġdid!");
 eku PHP_EOL;

 / / Ħoss,, ħoss ħoss ...  Aħbarijiet Flash!
 "Newsflash: moda u futbol jgħaqqdu" eku.  PHP_EOL;
 eku'======================================='.  PHP_EOL;
 $ Suġġett> addNewsStory ("moda u futbol jgħaqqdu");
 eku PHP_EOL;

 / / Ħoss,, ħoss ħoss ...  Aħbarijiet Flash!
 eku "Newsflash: mużika u l-politika, liema jmiss?"  .  PHP_EOL;
 eku'=========================================='.  PHP_EOL;
 $ Suġġett> addNewsStory ('mużika u l-politika, liema jmiss? ");
 eku PHP_EOL;

 / **
  Gossipers * jikbru għajjien ta 'aħbarijiet malajr ħafna u ikunu iddeċidew
  * Biex jieqfu jisimgħu, minkejja l-aħbarijiet interessanti illum!
  * /
 eku "- GossipObserver huwa bored u tħalli l-grupp!"  .
      PHP_EOL.  PHP_EOL;
 $ Suġġett> removeObserver ($ gossiper);

 / / Ħoss,, ħoss ħoss ...  Aħbarijiet Flash - Aġġornament għall storja preċedenti!
 eku "NewsUpdate: moda u futbol jgħaqqdu jgħid".
      "Gvern".  PHP_EOL;
 eku'================================================ ".
      '========='.  PHP_EOL;
 $ Suġġett> addNewsStory ("moda u futbol jgħaqqdu".
                         "Jgħid gvern");
 eku PHP_EOL;

 jekk (! vojta ($ _SERVER ["HTTP_USER_AGENT"])) {
     "eku 

";

}

3 Responses to "Disinji Disinn PHP - Pattern Osservatur"

  1. Vow jgħid:

    Hello,
    L-ewwel, Ingliż tiegħi hija fqira ħafna, imbagħad
    Tista 'tgħidli liema hija s-sistema fl-istampa?
    Fedora 12?
    X'inhu l-tema?

  2. Vow jgħid:

    Hello,
    Tista 'tgħidli liema hija s-sistema fl-istampa?
    Fedora 12?
    X'inhu l-tema?

Leave a Reply













Tema panorama mill- Themocracy

5 viżitaturi online issa
3 mistednin, 2 bot, 0 membri
Max viżitaturi llum: 23 fil 02:00 UTC
Dan ix-xahar: 47 fi 2011/03/10 02:47 UTC
Din is-sena: 130 fuq 28-03-2011 10:40 pm UTC
Il-ħin kollu: 130 fuq 28-03-2011 10:40 pm UTC