PHP návrhové vzory - vzor Pozorovatel
Četl jsem hlavou napřed návrhové vzory v poslední době a rozhodl se napsat některé vzory jako příklady PHP pro vlastní prospěch. První z nich, že jsem se rozhodl ke kódu se je vzor Observer . Formální definice Observer Vzorek je:
Pozorovatel vzor (podmnožina asynchronní publish / subscribe vzor ) je software design vzor , ve kterém objekt , nazvaný předmět, udržuje seznam jeho rodinné příslušníky, tzv. pozorovatelé, a upozorní je automaticky jakékoli změny stavu, obvykle tím, že volá jeden z jejich metod . Používá se zejména k provádění distribuovaných systémů zpracování událostí.
Jak se systémy volněji vázanou ujistěte se, že když se stane událost všechny systémy, které vyžadují znalost těchto aktualizací je informován. Například, blogu, po uložení post budeme muset aktualizovat vyhledávače (např. Lucene), aktualizovat náš sitemap, tagy, e-mail objednané uživatele, atd. pozorovatel vzor umožňuje vývojářům přidat další posluchače bez úpravy jejich pozorovatelný objekt . Nástřikem pozorovatelů (tj. vyhledávač aktualizace pozorovatele, sitemap generátor, atd.), do předmětu (tj. editace blogu systému) můžeme dovolit plně vykonávat všechny potřebné aktualizace bez jakýchkoliv změn.
Před vzor Observer byl identifikován obvyklý trik by bylo aktualizovat pozorovatelný objekt s další řádek kódu aktualizovat požadované systému, a odstranit řádek kódu jak je požadováno. Toto neumožňuje snadné přidávání a odebírání pozorovatelé.
Předmětem aktualizuje všechny své pozorovatele přes metodu aktualizace. Tato aktualizace metoda volá metodu každého pozorovatele, který je odvozen z provádí rozhraní. Pozorovatelé mohou přidávat odstranit sami pomocí metod v pozorovatelný objektu.
To je v podstatě to! Vždycky jsem si najít příklad, že je nejlepší způsob učení / pochopení, takže tady je můj kód se například ...
Pozorovatel vzor v PHP
V mém příkladu jsem vytvořil systém zpráv (NewsAggregator), který vysílá titulek aktualizace novinky na menší novinek. Zde zpravodajství sytem zabere místo předmětu, pozorovatelný, vzhledem k tomu, atd novinek vzít roli pozorovatelů, nebo posluchačů.
Jakmile inicializace pozorovatelé mohou připojit a odpojit se od tématu, jak uznají za vhodné. V mém příkladu jsem vytvořil tři pozorovatelé tyto scan titulky rozeslané předmětu a 'křičet' zprávy, pokud jeho potřeby. Tři pozorovatelé jsou jmenovány níže společně s podmínkami, které pro vyhledávání při příjmu novinové titulky:
- Sport Pozorovatel: 'rugby', 'fotbal', 'tenis'
- Novinky Pozorovatel: 'politika', 'finance', 'vlády'
- Gossip Pozorovatel: 'celebrity', 'hudba', 'módní'
Po initalising předmětu přidám novinky a klepy pozorovatelů a vyslat novinky aktualizace. Poté, co je to sport pozorovatel přidané před více novinek jsou odesílány ven. Konečně drby pozorovatel je odstraněn před konečnou zprávou titulek je rozesláno.
Tři různé pozorovatele třídy implementovat rozhraní Observer, to jim dává jasné rozhraní / metoda, která budou přijímat aktualizace. Za předpokladu, že implementovat rozhraní Observer budou schopni se připojit k předmětu. To také udržuje s programovacím paradigmatu 'program na rozhraní nejsou implementace'. Třídy NewsAggregator rozšiřuje abstraktní třídu Předmět, který nám poskytuje tři požadovaná veřejné metody:
- updateObservers ()
- addObserver ()
- removeObserver ()
Kód může být viděn tady běží, Observer vzor v PHP Provoz a kód si můžete stáhnout zde, vzor Pozorovatel v PHP kódu .
Pozorovatel Script
<? Php / ** * Tento soubor obsahuje pozorovatelé * * @ Autor Lloyd Watkin * @ Od 2009/12/23 * / abstraktní třídy Předmět { abstraktní veřejné funkce addObserver (Observer $ pozorovatel); abstraktní veřejné funkce removeObserver (Observer $ pozorovatel); abstraktní veřejné funkce updateObservers ($ newsHeadline); } / ** * To je předmětem třída pro příklad * * @ Autor Lloyd Watkin * @ Od 2009/12/23 * / třída ArticleAggregator rozšiřuje Předmět { / ** * Uchová seznam našich pozorovatelů * * @ Var pole * / chráněné $ _observerList = array (); / ** * Metoda přidat pozorovatele * * @ Var $ Pozorovatel pozorovatele * @ Return neplatné * / veřejné funkce addObserver (Observer $ pozorovatel) { $ This-> _observerList [] = $ pozorovatel; } / ** * Metoda k odstranění pozorovatele * * @ Var $ Pozorovatel pozorovatele * @ Return boolean * / veřejné funkce removeObserver (Observer $ pozorovatel) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ pozorovatele) { unset ($ this-> _observerList [$ key]); return true; } } návrat false; } / ** * Metoda update pozorovatele * * @ Var string $ newsHeadline * @ Return neplatné * / veřejné funkce updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Přidat nový novinová zpráva * * @ Var string $ příběh * @ Return neplatné * / veřejné funkce addNewsStory ($ příběh) { if (empty ($ příběh) | |! is_string ($ příběh)) { throw new InvalidArgumentException ('Očekávané novinky příběh!'); } $ This-> updateObservers ($ příběh); } }
Předmět / Pozorovatelné Script
? <Php / ** * Tento soubor obsahuje předmět * * @ autor * @ Lloyd Watkin od 2009/12/23 * / abstraktní třídy Předmět {abstraktní veřejné funkce addObserver (Observer $ pozorovatel), abstraktní veřejné funkce removeObserver (Observer $ pozorovatel ), abstraktní veřejné funkce updateObservers ($ newsHeadline);} / ** * Toto je předmětem třída pro příklad * * @ autor * @ Lloyd Watkin od 2009/12/23 * / třída ArticleAggregator rozšiřuje Předmět {/ ** * Drží seznam našich pozorovatelů * * @ var pole * / $ chráněných _observerList = array (); / ** * Metoda přidat pozorovatele * * @ var $ Pozorovatel pozorovatele * @ return void * / veřejné funkce addObserver (Observer $ pozorovatel) {$ this-> _observerList [] = $ pozorovatel;} / ** * metoda k odstranění pozorovatele * * @ var $ Pozorovatel pozorovatele * @ return boolean * / public funkce removeObserver (Observer $ pozorovatel) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ pozorovatele) {unset ($ this-> _observerList [$ key]); return true;}} vrátí false;} / ** * Metoda update pozorovatele * * @ var string newsHeadline * @ return void * / veřejné funkce updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Přidat Nový příběh novinky * * @ var string příběh * @ return void * / veřejné funkce addNewsStory ($ příběh) {if (empty ($ příběh) | |! is_string ($ příběh)) {throw new InvalidArgumentException ('Očekávané novinky Příběh ');!} $ this-> updateObservers ($ příběh);}} Regulátor Script
<? Php / ** * Pozorovatel Návrhový vzor příkladu * * @ Autor Lloyd Watkin * @ Od 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / patří 'observers.php'; patří 'subject.php'; if (! prázdné ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Co budeme dělat? echo 'Observer vzor příkladu v PHP'. PHP_EOL; echo'================================'. PHP_EOL; / / Nastavení náš předmět $ Subject = new ArticleAggregator (); echo '- ArticleAggregator vytvořili'. PHP_EOL; / / Přidat někteří pozorovatelé $ Subject-> addObserver (nové NewsObserver ()); $ Subject-> addObserver ($ někdo kdo přišel do řečí = new GossipObserver ()); echo '- Přidáno NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Píp, píp, píp ... Novinky Flash! echo 'NewsFlash: celebrity rugby hráč miluje finance'. PHP_EOL; echo'================================================ '. PHP_EOL; $ Subject-> addNewsStory ('celebrity rugby hráč miluje financí'); echo PHP_EOL; echo '- SportObserver zjistila, a chce, aby se připojila ke skupině!'; $ Subject-> addObserver (nové SportObserver ()); echo PHP_EOL. PHP_EOL; / / Píp, píp, píp ... Novinky Flash! echo 'NewsFlash: vláda zmatky se znovu!' . PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('vláda zmatky znovu!'); echo PHP_EOL; / / Píp, píp, píp ... Novinky Flash! echo 'NewsFlash: móda a fotbal kombinovat'. PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('módy a fotbalu kombinovat'); echo PHP_EOL; / / Píp, píp, píp ... Novinky Flash! echo 'NewsFlash: hudba a politika, co dál?' . PHP_EOL; echo'=========================================='. PHP_EOL; $ Subject-> addNewsStory ('hudby a politiky, co dál?'); echo PHP_EOL; / ** * Gossipers bavit zpráv velmi rychle a rozhodli * Přestat poslouchat i přes všechny zajímavé novinky ještě dnes! * / echo '- GossipObserver je nudí a opustí skupinu!' . PHP_EOL. PHP_EOL; $ Subject-> removeObserver ($ někdo kdo přišel do řečí); / / Píp, píp, píp ... Novinky Flash - Aktualizace starší příběh! echo 'NewsUpdate: móda a fotbal kombinovat říká'. 'Vlády'. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Subject-> addNewsStory ('módy a fotbalu kombinovat'. 'Říká vláda'); echo PHP_EOL; if (! prázdné ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}



















































Dobrý den,
Za prvé, moje angličtina je velmi špatná, pak
Můžete mi říct, co je systém na obrázku?
Fedora 12?
Jaké je téma?
Dobrý den,
Můžete mi říct, co je systém na obrázku?
Fedora 12?
Jaké je téma?
Jeho Fedora 11 s KDE použít. Glasslooks téma věřím.