PHP Disinji Disinn - Pattern Osservatur

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

Stajt ġiet qari Kap Ewwel Disinji Disinn reċentement u li iddeċieda li jikteb xi wħud mill-mudelli bħala eżempji PHP għall-benefiċċju personali tiegħi. L-ewwel wieħed li stajt iddeċieda li kodiċi up huwa l- Pattern Osservatur . Id-definizzjoni formali ta 'l Pattern Osservatur huwa:

Il-mudell ta 'osservatur (subsett tal-asinkronu tippubblika / tabbona mudell ) huwa softwer mudell disinn li fih oġġett , imsejħa s-suġġett, iżomm lista ta 'dipendenti tiegħu, osservaturi imsejħa, u jgħarraf b'mod awtomatiku ta' kwalunkwe bidliet istat, normalment billi ċċempel wieħed mill tagħhom metodi . Dan huwa prinċipalment użat biex jimplimentaw sistemi distribwiti tqandil avveniment.

Kif is-sistemi jsiru aktar laxk flimkien jagħmlu ċert li, meta avveniment jiġri s-sistemi kollha li jeħtieġu għarfien ta 'dawn l-aġġornamenti huma infurmati. Per eżempju, blog post, wara l-iffrankar post għandna jistgħu jeħtieġu li jiġu aġġornati search engine (eż. Lucene), taġġorna sitemap tagħna, tikketti, 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 osservaturi (jiġifieri tiftix magna aġġornament osservatur, ġeneratur sitemap, eċċ) fis-suġġett (jiġifieri blog post editjar sistema) nistgħu jippermettu l-li twettaq 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 mal-linja addizzjonali ta 'kodiċi li jaġġorna s-sistema meħtieġa, u tneħħi l-linja tal-kodiċi kif meħtieġ. Dan ma jippermettix faċilment żieda-tneħħija u osservaturi.

L-aġġornamenti kollha jkunu soġġetti ta 'osservaturi tagħha permezz ta' metodu aġġornament. Dan il-metodu aġġornament jitlob metodu f'kull osservatur li huwa derivat mill-implimentazzjoni ta 'interface. Osservaturi tista 'żżid tneħħi lilhom infushom permezz ta' metodi fl-oġġett osservabbli.

Li bażikament it! Jien dejjem issib eżempju li jkun l-aħjar metodu ta 'tagħlim / fehim hekk hawn eżempju kodifikati up tiegħi ...

Pattern Osservatur fil PHP

Fl-eżempju tiegħi stajt ħolqot sistema aħbarijiet (NewsAggregator) li tibgħat l-aġġornamenti lett aħbarijiet li feeds aħbarijiet 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ħu l-irwol ta' l-osservaturi jew semmiegħa.

Ladarba osservaturi tinbeda tista 'tehmeż u aqla ruħhom mill-suġġett kif jidhrilhom xieraq. Fl-eżempju tiegħi I ħolqu tlett 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 huma iskan għal meta aħbarijiet jirċievu aħbarijiet:

  • tennis "" "rugby", l-Isport Osservatur: "futbol",
  • Aħbarijiet Osservatur: "politika", "finanzjament", "gvern"
  • moda "" "ċelebrità", Gossip Osservatur: "mużikali",

Wara initalising-suġġett I żid il-osservaturi aħbarijiet u 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 huwa mibgħut.

It-tliet klassijiet osservatur differenti timplimenta l-Osservatur interface, din tagħtihom interface ċara / metodu li permezz tiegħu se jirċievu aġġornamenti. Sakemm dawn jimplimentaw l-interface Osservatur dawn se jkunu jistgħu jagħtu ruħhom għall-Suġġett. Dan żżomm ukoll il-paradigma ipprogrammar ta '"programm għall-interfaces ma implimentazzjonijiet". Il-klassi NewsAggregator testendi l-Suġġett klassi astratt, li jagħtina l-tliet metodi pubbliku meħtieġa:

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

Il-kodiċi jistgħu jidhru running hawn, Osservatur Pattern fil-PHP Running , u l-kodiċi jistgħu jitniżżlu minn hawn, Osservatur Pattern fil PHP Kodiċi .

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
	  *
	  * @ Firxa var
	  * /
	 protetti $ _observerList = array ();

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

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

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

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

Suġġett / osservabbli Script

 ? <Php / ** * Dan il-fajl fih l * * suġġett @ awtur Lloyd Watkin * @ peress 2009/12/23 * / astratt klassi Suġġett {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 * / klassi ArticleAggregator testendi Suġġett {/ ** * Stivi lista ta 'tagħna * * osservaturi @ * firxa var / protetti $ _observerList = array (); / ** * Metodu li jżid osservatur * * @ var Osservatur * osservatur $ @ ritorn * null / pubbliċi funzjoni addObserver (Osservatur $ osservatur) {_observerList $ dan il-> [] = osservatur $;} / ** * Metodu biex jitneħħew osservatur * * @ var Osservatur * $ osservatur @ ritorn * Boolean / pubbliċi funzjoni removeObserver (Osservatur $ osservatur) {foreach ($ dan il-> _observerList KIF $ ċavetta => $ ob) {jekk ($ ob == $ osservatur) {mitfi (_observerList $ dan il-> [$ ewlenin]); ritorn vera;}} ritorn foloz;} / ** * Metodu biex taġġorna l-osservaturi * * @ var string $ * newsHeadline @ * null ritorn / updateObservers pubbliku funzjoni ($ newsHeadline) {foreach ($ dan il-> _observerList KIF $ ob) {aġġornament $ ob-> ($ newsHeadline);}} / ** * Żid ġdid aħbarijiet storja * * @ var string $ * istorja @ ritorn * null / pubbliċi funzjoni addNewsStory ($ istorja) {jekk (vojta ($ istorja) | |! is_string ($ istorja)) {tarmi InvalidArgumentException ġdid ('mistennija ta' aħbarijiet istorja ");!} $ dan il-> updateObservers ($ istorja);}} 

Kontrollur Script

  <? PHP
 / **
  * Osservatur Disinn Pattern 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 Eżempju Pattern fil-PHP".  PHP_EOL; eku'================================'.  PHP_EOL; / / Stabbilit ArticleAggregator = suġġett suġġett tagħna $ ġodda (); eku "- ArticleAggregator maħluqa".  PHP_EOL; / / Żid xi osservaturi addObserver $ suġġett-> (ġdid NewsObserver ()); addObserver $ suġġett-> ($ gossiper = ġdid GossipObserver ()); eku "- Added NewsObverser & GossipObserver".  PHP_EOL.  PHP_EOL; / / ħoss, ħoss, ħoss ...  Flash News!  eku "Newsflash: player tar-rugby ċelebrità iħobb finanzi".  PHP_EOL; eku'============================================== == ".  PHP_EOL; $ suġġett-> addNewsStory ("player tar-rugby ċelebrità iħobb finanzjament"); eku PHP_EOL; eku "- SportObserver sab u trid li jingħaqdu mal-grupp!"; AddObserver $ suġġett-> (ġdid SportObserver ()); eku PHP_EOL .  PHP_EOL; / / ħoss, ħoss, ħoss ...  Flash News!  eku "Newsflash: il-gvern tal-mensi darb'oħra!"  .  PHP_EOL; eku'======================================='.  PHP_EOL; $ suġġett-> addNewsStory ("gvern tal-mensi darb'oħra!"); Eku PHP_EOL; / / ħoss, ħoss, ħoss ...  Flash News!  eku "Newsflash: moda u futbol jgħaqqdu".  PHP_EOL; eku'======================================='.  PHP_EOL; $ suġġett-> addNewsStory ("moda u futbol jgħaqqdu"); eku PHP_EOL; / / ħoss, ħoss, ħoss ...  Flash News!  eku "Newsflash: mużika u l-politika, dak li jmiss?"  .  PHP_EOL; eku'=========================================='.  ("Mużika u l-politika, dak li jmiss?") $-Suġġett ta '> addNewsStory;; PHP_EOL eku PHP_EOL; / ** Gossipers * jikbru għajjien ta' aħbarijiet malajr ħafna u ikunu iddeċidew * biex tieqaf smigħ, minkejja l-aħbarijiet interessanti llum!  * / Eku "- GossipObserver hija 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 "PHP Disinji Disinn - Pattern Osservatur"

  1. Vow says:

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

  2. Vow says:

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

Leave a Reply













Tema Panorama minn Themocracy

11 viżitaturi online issa
7 mistednin, 4 bots, 0 membri
viżitaturi llum Max: 24 fuq 00:36 UTC
Dan ix-xahar: 26 fil 2011/07/05 12:35 UTC
Din is-sena: pm UTC 130 fil 28-03-2011 10:40
Il-ħin kollu: pm UTC 130 fil 28-03-2011 10:40