Design Patterns PHP - Wzorzec Obserwator
Czytałem Head First Design Patterns niedawno i postanowiłem napisać kilka wzorów jako przykłady PHP dla własnej korzyści. Pierwszy z nich, że zdecydowałem się na kod jest Observer Pattern . Formalna definicja Observer Pattern to:
Wzorzec obserwatora (podzbiór asynchroniczne Publish / Subscribe wzór ) jest oprogramowanie wzorca projektowego , w którym obiekt , zwany temat, utrzymuje listę jego utrzymaniu, obserwatorów nazywa, i powiadamia je automatycznie o wszelkich zmianach stanu, zazwyczaj przez wywołanie jeden z ich metod . Jest on głównie wykorzystywany do realizacji rozproszonych systemów obsługi zdarzeń.
Ponieważ systemy bardziej luźno upewniając się, że gdy zdarzenie wszystkich systemów, które wymagają znajomości aktualizacje te informacje. Na przykład, blogu, po zapisaniu post możemy być zmuszeni do aktualizacji wyszukiwarki (np. Lucene), aktualizacja naszej sitemap, tagi, e-mail subskrypcji użytkowników, itp. wzorzec obserwatora pozwala programistom na dodatkowe słuchaczy bez edycji swoich obserwacji obiektu . Poprzez wstrzyknięcie obserwatorów (tj. wyszukiwarki obserwatora aktualizacji Sitemap Generator, itp.) na temat (tzn. blogu system edycji) możemy pozwolić mu na wykonywanie wszystkich niezbędnych aktualizacji bez żadnych zmian.
Przed wzorzec Observer stwierdzono zwykły trick byłoby zaktualizować obserwacji obiektu z dodatkowych linii kodu, aby uaktualnić wymagane system i usuwanie wiersza kodu, w miarę potrzeb. To nie pozwala na łatwe dodawanie i usuwanie obserwatorów.
Przedmiotem aktualizacji wszystkich swoich obserwatorów za pomocą metody aktualizacji. Ta metoda wywołuje metodę aktualizacji w każdy obserwator, który wywodzi się od wykonania interfejsu. Obserwatorzy mogą dodawać usunąć się za pomocą metod w obserwacji obiektu.
To w zasadzie to! I zawsze znaleźć przykład jest to najlepszy sposób uczenia się / zrozumienie więc oto mój kodowane na przykład ...
Wzorzec Obserwator w PHP
W moim przykładzie stworzyliśmy system news (NewsAggregator), które wysyła aktualizacje nagłówek wiadomości do mniejszych kanałów informacyjnych. Tutaj sytem news zajmuje miejsce zastrzeżeniem, Observable etc natomiast kanałów informacyjnych się w rolę obserwatorów i słuchaczy.
Po zainicjowane obserwatorzy mogą dołączyć i odłączyć się od osoby, której jak im się podoba. W moim przykładzie stworzyłem trzech obserwatorów, te skanowanie nagłówki wysyłane przez obiekt i "wiadomość, wiadomość, jeśli jej właściwe. Trzech obserwatorów są wymienione poniżej wraz z warunkami ich skanowanie w momencie otrzymania doniesienia prasowe:
- Sport Observer: "rugby", "piłka nożna", "tenis"
- News Observer: "polityka", "finanse", "publiczny"
- Gossip Observer: "Celebrity", "muzyka", "moda"
Po initalising temat dodam nowości i plotek obserwatorów i wysłać aktualizacji wiadomości. Po tym obserwatora sport jest dodawany przed bardziej aktualizacje wiadomości są wysyłane. Wreszcie obserwatora plotek jest usuwany przed podjęciem ostatecznej Headline News jest wysyłany.
Trzy różne klasy obserwatora implementować interfejs Observer, to daje im przejrzysty interfejs / sposób w jaki będą otrzymywać aktualizacje. Zakładając, że implementują interfejs Observer będą mogli dołączyć się do tematu. To również prowadzi z paradygmatem programowania "programu do interfejsów nie implementacji. Klasa NewsAggregator rozszerza streszczenie zastrzeżeniem klasy, co daje nam trzech wymaganych metod publicznych:
- updateObservers ()
- addObserver ()
- removeObserver ()
Kod można zobaczyć tutaj działa, Observer Pattern w PHP Running , a kod można pobrać stąd, Observer Pattern w PHP Code .
Observer Script
<? Php / ** * Ten plik zawiera obserwatorów * * @ Author Lloyd Watkin * @ Od 2009/12/23 * / Przedmiot klasy streszczenie { streszczenie publicznych addObserver funkcji (Observer $ observer); streszczenie publicznych removeObserver funkcji (Observer $ observer); streszczenie publicznych updateObservers function ($ newsHeadline); } / ** * Jest to przedmiot klasy na przykład * * @ Author Lloyd Watkin * @ Od 2009/12/23 * / Przedmiot rozszerza klasy ArticleAggregator { / ** * Przechowuje listę naszych obserwatorów * * @ Var array * / protected $ _observerList = array (); / ** * Metoda dodać obserwatora * * @ Var Observer $ obserwatora * Powrót nieważne @ * / publicznych addObserver funkcji (Observer $ observer) { $ This-> _observerList [] = $ obserwatora; } / ** * Metoda usunąć obserwatora * * @ Var Observer $ obserwatora * Powrót boolean @ * / publicznych removeObserver funkcji (Observer $ observer) { foreach ($ this-> _observerList as $ klucz => $ ob) { if ($ ob == $ observer) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Metody aktualizacji obserwatorów * * @ Var string $ newsHeadline * Powrót nieważne @ * / publicznych updateObservers function ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Dodaj nową historię wiadomości * * @ Var string historia * Powrót nieważne @ * / publicznych addNewsStory function ($ opowiadanie) { if (empty ($ opowiadanie) | |! is_string ($ story)) { throw new InvalidArgumentException (Oczekiwana gorący news '); } $ This-> updateObservers ($ historia); } }
Temat / Observable Script
<Php / ** * Plik ten zawiera przedmiotem * * @ author * @ Lloyd Watkin od 2009/12/23 * / abstrakcyjne zastrzeżeniem klasy {abstract publicznych addObserver funkcji (Observer $ observer); streszczenie publicznych removeObserver funkcji (Observer $ obserwatora ); streszczenie publicznych updateObservers function ($ newsHeadline);} / ** * To jest temat na przykład klasy * * @ author * @ Lloyd Watkin od 2009/12/23 * / class ArticleAggregator rozciąga Subject {/ ** * Przechowuje Lista naszych obserwatorów * * * @ var array / protected $ _observerList = array (); / ** * Metoda dodać obserwatora * * @ var Observer $ * @ return obserwatora void * / public addObserver funkcji (Observer $ observer) {$ this-> _observerList [] = $ obserwatora;} / ** * Metoda usunąć obserwatora * * @ var Observer $ * Obserwator * @ return boolean / public removeObserver funkcji (Observer $ observer) {foreach ($ this-> klucz _observerList AS $ => $ ob) {if ($ ob == $ observer) {unset ($ this-> _observerList [$ key]); return true;}} return false;} / ** * Metoda aktualizacji obserwatorów * * @ var string $ newsHeadline * @ return void * / public updateObservers function ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Dodaj Nowa historia wiadomości * * @ var string historia * @ return void * / public addNewsStory function ($ story) {if (empty ($ opowiadanie) | |! is_string ($ story)) {throw new InvalidArgumentException (Oczekiwana wiadomości historia ");} $ this-> updateObservers ($ historia);}} Skrypt kontrolera
<? Php / ** * Przykład Pattern Design Observer * * @ Author Lloyd Watkin * @ Od 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / obejmuje "observers.php"; obejmuje "subject.php"; if (! empty ($ _SERVER ["HTTP_USER_AGENT"])) { echo '"; } / / Co robimy? echo 'Observer wzorcowy przykład w PHP. PHP_EOL; echo'================================'. PHP_EOL; / / Ustawiamy nasz temat $ Temat = new ArticleAggregator (); echo '- ArticleAggregator stworzony ". PHP_EOL; / / Dodaj niektórzy obserwatorzy $ Subject-> addObserver (nowy NewsObserver ()); $ Subject-> addObserver ($ gossiper = new GossipObserver ()); echo '- Dodano NewsObverser i GossipObserver. PHP_EOL. PHP_EOL; / / Sygnał, sygnał, sygnał ... Flash News! echo 'W skrócie: gracz rugby sławna kocha finansowania ". PHP_EOL; echo'================================================ ". PHP_EOL; $ Subject-> addNewsStory ("gracz rugby sławna kocha finansów); echo PHP_EOL; echo '- SportObserver dowiedziała się, i chce dołączyć do grupy'; $ Subject-> addObserver (nowy SportObserver ()); echo PHP_EOL. PHP_EOL; / / Sygnał, sygnał, sygnał ... Flash News! echo 'W skrócie: rząd bałagan jeszcze raz! " . PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ("rząd bałagan jeszcze raz! '); echo PHP_EOL; / / Sygnał, sygnał, sygnał ... Flash News! echo 'W skrócie: moda i piłka nożna łączy ". PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ("moda i piłki nożnej połączyć '); echo PHP_EOL; / / Sygnał, sygnał, sygnał ... Flash News! echo 'W skrócie: muzyka i polityka, i co dalej? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Subject-> addNewsStory ("muzyka i polityka, i co dalej?"); echo PHP_EOL; / ** * Plotkarzy zmęczeni nowości bardzo szybko i postanowiliśmy * Przestać słuchać, pomimo wszystkich interesujących nowościach już dziś! * / echo '- GossipObserver się nudzi i opuszcza grupę! . PHP_EOL. PHP_EOL; $ Subject-> removeObserver ($ gossiper); / / Sygnał, sygnał, sygnał ... News Flash - Aktualizacja do wcześniejszej historii! echo 'NewsUpdate: moda i piłki nożnej połączyć mówi. "Rządu". PHP_EOL; echo'================================================ ". '========='. PHP_EOL; $ Subject-> addNewsStory ("moda i piłka nożna łączy". Mówi rząd '); echo PHP_EOL; if (! empty ($ _SERVER ["HTTP_USER_AGENT"])) { echo '";
}



















































Witam,
Po pierwsze, mój angielski jest bardzo słaby, a następnie
Czy możesz mi powiedzieć jaki jest system na zdjęciu?
Fedora 12?
Co to jest motyw?
Witam,
Czy możesz mi powiedzieć jaki jest system na zdjęciu?
Fedora 12?
Co to jest motyw?
Jego Fedora 11 z KDE stosowane. temat Glasslooks wierzę.