PHP Design Patterns - Observer Pattern

By , tiistai 29 joulukuu 2009 22:02

Olen lukenut Head First Design Patterns äskettäin ja ovat päättäneet kirjoittaa joitakin malleja kuin PHP esimerkkejä omasta hyödyksi. Ensimmäinen jonka olen päättänyt koodi ylös on Observer Pattern . Muodollinen määritelmä Observer Pattern on:

Tarkkailija kuvio (osajoukko asynkronisen julkaista / tilata kuvio ) on ohjelmisto suunnittelumallia , jossa esine , nimeltään aihe, ylläpitää luetteloa sen huollettavia, kutsutaan tarkkailijoiksi, ja ilmoittaa ne automaattisesti minkään valtion muutoksia, yleensä soittamalla yksi niiden menetelmistä . Sitä käytetään pääasiassa toteuttaa hajautettujen tapahtumaan käsittelyjärjestelmiä.

Kun järjestelmät tulevat entistä väljästi kytketyt varmistaa, että kun tapahtuma tapahtuu kaikille, jotka tarvitsevat tietoa näistä päivityksistä ilmoitetaan. Esimerkiksi blogi, tallennuksen jälkeen post saatamme joutua päivittämään hakukoneen (esim. Lucene), päivittää sivustokartta, Tunnisteet, sähköposti merkityt käyttäjät jne. tarkkailija kuvio avulla kehittäjät voivat lisätä kuuntelijoita ilman muokatessaan havaittavissa kohde . Injektoimalla tarkkailijat (eli hakukone päivittää tarkkailija, sivukartta generaattori, jne) aihe (eli blogikirjoitus muokkausjärjestelmä) voimme antaa se suorittaa kaikki tarvittavat päivitykset ilman muutoksia.

Ennen tarkkailijan kuvio havaittiin tavallista temppu olisi päivittää havaittavissa objekti ylimääräinen koodirivi päivittää tarvitaan järjestelmä, ja poistamalla koodirivin tarpeen mukaan. Tämä ei salli helposti lisäämällä ja poistamalla tarkkailijoita.

Aihe päivittää kaikki sen tarkkailijat kautta Update-menetelmää. Tämä päivitys menetelmä edellyttää, kussakin tarkkailija, joka on johdettu täytäntöön käyttöliittymän. Tarkkailijat voivat lisätä poistaa itsensä läpi menetelmiä havaittavissa esine.

Se on pohjimmiltaan se! Minusta on aina esimerkki on paras tapa oppia / ymmärtää Joten tässä on minun koodattu jopa esimerkki ...

Observer Pattern PHP

Minun esimerkki Olen luonut uutiset System (NewsAggregator) joka lähettää uutisia otsikko päivityksistä pienempiä uutissyötteitä. Täällä uutiset sytem vie paikan Aihe, havaittavissa, jne. taas uutissyötteitä ottaa roolin tarkkailijoita tai kuuntelijoita.

Kun alustus tarkkailijat voivat kiinnittää ja irrottaa itsensä aihe parhaaksi katsomallaan tavalla. Minun esimerkki, jonka olen luonut kolme tarkkailijaa, nämä skannata otsikoissa lähetetään ulos aihe ja "huutaa" uutinen, jos sen tarvittaessa. Kolme tarkkailijaa on nimetty alle yhdessä termejä he etsiä saadessaan uutisotsikoita:

  • Sport Observer: "rugby", "jalkapallo", "tennis"
  • Uutiset Observer: "Politiikka", "rahoitus", "hallitus"
  • Gossip Observer: "julkkis", "musiikki", "muoti"

Kun initalising aihe Lisään uutiset ja juorut tarkkailijat ja lähettää news päivitystä. Tämän jälkeen Sport tarkkailija on lisätty ennen lisää uutisia päivitykset lähetetään ulos. Lopuksi juorut tarkkailija on poistettava ennen lopullisen uutinen otsikko on lähetetty.

Kolme eri tarkkailija classes toteuttaa käyttöliittymän Observer, tämä antaa heille selkeä käyttöliittymä / menetelmä, jonka kautta he saavat päivityksiä. Jos ne toteuttaa Observer rajapinnan he voivat kiinnittyä Aihe. Tämä pitää myös ohjelmalliseen paradigma "ohjelman rajapinnat eivät toteutuksia. NewsAggregator luokka ulottuu abstrakti luokka Aihe, joka antaa meille kolmen vaadittavan julkinen menetelmiä:

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

Koodia voidaan nähdä käynnissä täällä, Observer Pattern PHP Running , ja koodin voi ladata täältä, Observer Pattern PHP Code .

Observer Script

  <? Php
 / **
  * Tämä tiedosto sisältää tarkkailijat
  *
  * @ Author Lloyd Watkin
  * @ Vuodesta 23.12.2009
  * /

 abstrakti luokka Aihe
 {
	 Tiivistelmä julkisessa tehtävässä addObserver (Observer $ tarkkailija);
	 Tiivistelmä julkisessa tehtävässä removeObserver (Observer $ tarkkailija);
	 Tiivistelmä julkisessa tehtävässä updateObservers ($ newsHeadline);
 }

 / **
  * Tämä on aihe luokassa esimerkiksi
  *
  * @ Author Lloyd Watkin
  * @ Vuodesta 23.12.2009
  * /
 class ArticleAggregator ulottuu Aihe
 {
	 / **
	  * Pitää luetteloa tarkkailijat
	  *
	  * @ Var array
	  * /
	 suojattu $ _observerList = array ();

	 / **
	  * Tapa lisätä tarkkailija
	  *
	  * @ Var Observer $ tarkkailija
	  * @ Return void
	  * /
	 julkisessa tehtävässä addObserver (Observer $ tarkkailija)
	 {
		 $ This-> _observerList [] = $ tarkkailija;
	 }

	 / **
	  * Tapa poistaa tarkkailija
	  *
	  * @ Var Observer $ tarkkailija
	  * @ Return boolean
	  * /
	 julkisessa tehtävässä removeObserver (Observer $ tarkkailija)
	 {
		 foreach ($ this-> _observerList kuin $ key => $ ob) {
			 if ($ OB == $ tarkkailija) {
				 unset ($ this-> _observerList [$ key]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Menetelmä päivittää tarkkailijat
	  *
	  * @ Var merkkijono $ newsHeadline
	  * @ Return void
	  * /
	 julkisessa tehtävässä updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList kuin $ ob) {
			 $ OB-> update ($ newsHeadline);
		 }
	 }

	 / **
	  * Lisää uusi uutinen
	  *
	  * @ Var merkkijono $ tarina
	  * @ Return void
	  * /
	 julkisessa tehtävässä addNewsStory ($ tarina)
	 {
		 if (empty ($ tarina) | |! is_string ($ tarina)) {
			 throw new InvalidArgumentException ("odotettu uutinen!");
		 }
		 $ This-> updateObservers ($ tarina);
	 }
 } 

Aihe / havaittavissa Script

 <? Php / ** * Tämä tiedosto sisältää aihe * * @ author Lloyd Watkin * @ vuodesta 12.23.2009 * / abstrakti luokka Aihe {abstrakti julkisen tehtävän addObserver (Observer $ tarkkailija); abstrakti julkisen tehtävän removeObserver (Observer $ tarkkailija ); abstrakti julkisen tehtävän updateObservers ($ newsHeadline);} / ** * Tämä on aihe luokassa esimerkiksi * * @ author Lloyd Watkin * @ vuodesta 12.23.2009 * / class ArticleAggregator ulottuu Aihe {/ ** * Pitää luettelo tarkkailijat * * @ var array * / protected $ _observerList = array (); / ** * tapa lisätä tarkkailija * * @ var Observer $ tarkkailija * @ return void * / public toiminto addObserver (Observer $ tarkkailija) {$ this-> _observerList [] = $ tarkkailija;} / ** * tapa poistaa tarkkailija * * @ var Observer $ tarkkailija * @ return boolean * / public toiminto removeObserver (Observer $ tarkkailija) {foreach ($ this-> _observerList kuin $ key => $ ob) {if ($ OB == $ tarkkailija) {unset ($ this-> _observerList [$ key]) return true;}} return false;} / ** * Method päivittää tarkkailijat * * @ var merkkijono $ newsHeadline * @ return void * / public toiminto updateObservers ($ newsHeadline) {foreach ($ this-> _observerList kuin $ ob) {$ OB-> update ($ newsHeadline);}} / ** * Lisää uusi uutinen * * @ var merkkijono $ tarina * @ return void * / public toiminto addNewsStory ($ tarina) {if (empty ($ tarina) | |! is_string ($ tarina)) {throw new InvalidArgumentException ("Odotettu uutinen tarina! ");} $ this-> updateObservers ($ tarina);}} 

Controller Script

  <? Php
 / **
  * Observer suunnittelumallia Esimerkki
  *
  * @ Author Lloyd Watkin
  * @ Vuodesta 23.12.2009
  * @ Link http://www.evilprofessor.co.uk
  * /
 kuuluu "observers.php";
 kuuluu "subject.php";

 if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo '
 ";} / / Mitä teemme?  echo 'Observer Pattern esimerkiksi PHP ".  PHP_EOL; echo'================================'.  PHP_EOL; / / perustamme oman aihe $ subject = uusi ArticleAggregator (); echo "- ArticleAggregator luotu".  PHP_EOL; / / lisään tarkkailijat $ kohteena> addObserver (uusi NewsObserver ()); $ kohteena> addObserver ($ gossiper = uusi GossipObserver ()); echo "- Lisätty NewsObverser & GossipObserver".  PHP_EOL.  PHP_EOL; / / Piip, piip, piip ...  News Flash!  echo 'uutinen: julkkis rugby pelaaja rakastaa rahoitusta ".  PHP_EOL; echo'============================================== == ".  PHP_EOL; $ kohteena> addNewsStory ("julkkis rugby pelaaja rakastaa rahoittaa"); echo PHP_EOL; echo "- SportObserver on saanut selville ja haluaa liittyä ryhmään!"; $ Kohteena> addObserver (uusi SportObserver ()); echo PHP_EOL .  PHP_EOL; / / Piip, piip, piip ...  News Flash!  echo 'uutinen: hallitus sotkee ​​taas! "  .  PHP_EOL; echo'======================================='.  PHP_EOL; $ kohteena> addNewsStory ("hallitus sotkee ​​taas!"); Echo PHP_EOL; / / Piip, piip, piip ...  News Flash!  echo 'uutinen: Muoti ja jalkapallo yhdistää ".  PHP_EOL; echo'======================================='.  PHP_EOL; $ kohteena> addNewsStory (muoti ja jalkapallo yhdistää "); echo PHP_EOL; / / Piip, piip, piip ...  News Flash!  echo 'uutinen: Musiikki ja politiikka, mitä seuraavaksi? "  .  PHP_EOL; echo'=========================================='.  PHP_EOL; $ kohteena> addNewsStory ('musiikkia ja politiikka, mitä seuraavaksi? "); Echo PHP_EOL; / ** * Gossipers kyllästyt uutiset nopeasti ja ovat päättäneet * lopettaa kuuntelu, vaikka kaikki kiinnostavimmat uutiset tänään!  * / Echo "- GossipObserver on tylsää ja jättää ryhmä!"  .  PHP_EOL.  PHP_EOL; $ kohteena> removeObserver ($ gossiper); / / Piip, piip, piip ...  News Flash - Päivitä aikaisemmin tarina!  echo 'NewsUpdate: Muoti ja jalkapallo yhdistää sanoo ".  "Hallitus".  PHP_EOL; echo'============================================== == ".  '========='.  PHP_EOL; $ kohteena> addNewsStory (muoti ja jalkapallo yhdistää "." Sanoo hallituksen "); echo PHP_EOL, jos (! Tyhjä ($ _SERVER ['HTTP_USER_AGENT'])) {echo ' 

";

}

3 Vastaus jotta "PHP Design Patterns - Observer Pattern"

  1. Vala sanoo:

    Hello,
    Ensinnäkin minun Englanti on erittäin huono, niin
    Voitteko kertoa minulle mitä on järjestelmä kuvassa?
    Fedora 12?
    Mikä on teema?

  2. Vala sanoo:

    Hello,
    Voitteko kertoa minulle mitä on järjestelmä kuvassa?
    Fedora 12?
    Mikä on teema?

Jätä kommentti













Panorama Teema Themocracy

6 vierailijaa nyt
1 vierasta, 5 vastaan, 0 jäsentä
Max kävijöitä tänään: 19 klo 06:09 UTC
Tässä kuussa: 19 at 19-08-2011 06:09 UTC
Tänä vuonna: 130 at 28-03-2011 22:40 UTC
Kaikki aika: 130 at 28-03-2011 22:40 UTC