PHP Design Patterns - Observer-Muster
Ich habe gelesen, Head First Design Patterns kürzlich beschlossen haben, einige der Muster als PHP-Beispiele schreiben für mein eigenes Wohl. Das erste, dass ich mich entschlossen, Code ist der Observer-Muster . Die formale Definition des Observer-Muster ist:
Der Beobachter-Muster (eine Teilmenge der asynchronen Publish / Subscribe-Pattern ) ist ein Software -Design-Pattern , in dem ein Objekt , genannt das Thema, führt eine Liste ihrer Angehörigen, genannt Beobachter und benachrichtigt sie automatisch von jedem Staat ändert, in der Regel durch den Aufruf eine ihrer Methoden . Es wird hauptsächlich verwendet, um verteilte Event-Handling-Systeme zu implementieren.
Als Systeme werden mehr lose gekoppelten dafür sorgen, dass, wenn ein Ereignis passiert, alle Systeme, die Kenntnisse über diese Aktualisierungen informiert werden müssen. Zum Beispiel, ein Blog-Post, nach dem Speichern einer post müssen wir eventuell eine Suchmaschine (zB Lucene) zu aktualisieren, aktualisieren Sie die Sitemap, Tags, E-Mail abonniert Nutzer usw. Der Beobachter-Muster ermöglicht es Entwicklern, zusätzliche Hörer ohne Bearbeitung zusätzlich ihre beobachtbaren Objekt . Durch die Injektion Beobachter (dh eine Suchmaschine aktualisieren Beobachter, eine Sitemap-Generator, etc.) in ein Thema (zB Blog-Post Editing-System) können wir damit die es zu allen notwendigen Updates ohne Änderungen durchzuführen.
Vor dem Observer-Muster identifiziert wurde die übliche Trick wäre, die beobachtbaren Objekt mit einer zusätzlichen Zeile Code, um die erforderliche System-Update aktualisieren und entfernen Sie die Codezeile wie erforderlich. Dies gilt nicht für leicht Hinzufügen und Entfernen von Beobachtern zu ermöglichen.
Das Thema Updates alle seine Beobachter über eine Update-Methode. Dieses Update-Methode ruft eine Methode in jeder Beobachter, die sich aus der Umsetzung einer Schnittstelle abgeleitet ist. Beobachter können ein entfernen sich durch Methoden in der beobachtbaren Objekt.
Das ist im Grunde ist es! Ich finde immer ein Vorbild für die beste Lernmethode / Verständnis also hier ist mein Code bis Beispiel ...
Observer-Muster in PHP
In meinem Beispiel habe ich Feeds erstellt ein News-System (NewsAggregator) sendet, die aus Schlagzeile Aktuelles zu kleineren Nachrichten. Hier werden die Nachrichten sytem tritt an die Stelle des Subjekts, beobachtbaren, etc Erwägung, dass die News-Feeds in die Rolle der Beobachter oder Zuhörer.
Einmal initialisiert Beobachter kann befestigen und lösen sich von dem Thema nach eigenem Gutdünken. In meinem Beispiel habe ich drei Beobachtern, erstellt dieser Scan die Schlagzeilen geschickt durch das Thema und "Shout" der Nachrichten, wenn seine angemessen. Die drei Beobachter sind unten zusammen mit den Bedingungen, die sie scannen für benannte beim Empfang Schlagzeilen:
- Sport Observer: "Rugby", "Fußball", "Tennis"
- News Observer: "Politik", "Finanzen", "Regierung"
- Gossip Observer: 'Celebrity', 'Musik', 'Mode'
Nach initalising das Thema füge ich die Nachrichten und Gerüchte, die Beobachter und senden eine Nachricht zu aktualisieren. Danach wird der Sport Beobachter hat vor mehr aktuelle Nachrichten gesendet werden. Schließlich die Gerüchte Beobachter entfernt wird, bevor eine endgültige Schlagzeile gesendet.
Die drei verschiedenen Beobachter Klassen implementieren die Schnittstelle Observer, gibt dieser ihnen eine klare Schnittstelle / Methode, durch die sie Updates erhalten. Vorausgesetzt, sie umzusetzen Observer Schnittstelle unterliegen sie können die zu heften sich an. Dies hält auch mit der Programmier-Paradigma des "Programms zur Schnittstellen-Implementierungen nicht." Die NewsAggregator Klasse erweitert die abstrakte Klasse vorbehalten, die uns mit den drei geforderten öffentlichen Methoden:
- updateObservers ()
- addObserver ()
- entferneBeobachter ()
Der Code kann, gesehen zu werden, hier zu laufen Observer Pattern in PHP Laufen , und der Code kann hier heruntergeladen werden Observer Pattern in PHP-Code .
Observer Script
<? Php / ** * Diese Datei enthält die Beobachter * * @ Author Lloyd Watkin * @ Since 2009/12/23 * / abstrakte Klasse vorbehalten { abstrakte öffentliche Funktion addObserver (Observer $ Beobachter); abstrakte öffentliche Funktion entferneBeobachter (Observer $ Beobachter); abstrakte öffentliche Funktion updateObservers ($ newsHeadline); } / ** * Dies ist das Thema für die Klasse B. * * @ Author Lloyd Watkin * @ Since 2009/12/23 * / Klasse ArticleAggregator erstreckt Betreff { / ** * Enthält eine Liste unserer Beobachter * * @ Var array * / protected $ _observerList = array (); / ** * Methode, einen Beobachter hinzufügen * * @ Var $ Observer Beobachter * @ Return void * / öffentliche Funktion addObserver (Observer $ Beobachter) { $ This-> _observerList [] = $ Beobachter; } / ** * Methode, einen Beobachter zu entfernen * * @ Var $ Observer Beobachter * @ Return boolean * / öffentliche Funktion entferneBeobachter (Observer $ Beobachter) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ Beobachter) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Methode zur Aktualisierung Beobachter * * @ Var string $ newsHeadline * @ Return void * / öffentliche Funktion updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ OB-> update ($ newsHeadline); } } / ** * Fügen Sie eine neue Nachrichten-Geschichte * * @ Var string $ Geschichte * @ Return void * / öffentliche Funktion addNewsStory ($ Geschichte) { if (empty ($ Geschichte) | |! is_string ($ Geschichte)) { throw new InvalidArgumentException ("Erwartete eine Story! '); } $ This-> updateObservers ($ Geschichte); } }
Betreff / Observable Script
? <Php / ** * Diese Datei enthält den Themen * * @ author Lloyd Watkin * @ since 2009/12/23 * / abstrakte Klasse Betreff {abstrakt öffentliche Funktion addObserver (Observer $ Beobachter); abstrakte öffentliche Funktion entferneBeobachter (Observer $ Beobachter ); abstrakte öffentliche Funktion updateObservers ($ newsHeadline);} / ** * Dies ist das Thema für die Klasse B. * * @ author Lloyd Watkin * @ since 2009/12/23 * / class ArticleAggregator erstreckt Betreff {/ ** * Hält eine Liste unserer Beobachter * * @ var array * / protected $ _observerList = array (); / ** * Methode, einen Beobachter * * @ var $ Observer Beobachter * @ return void * / public function addObserver (Observer $ Beobachter) hinzufügen {$ this-> _observerList [] = $ Beobachter;} / ** * Methode, einen Beobachter * * @ var entfernen Observer $ Beobachter * @ return boolean * / public function entferneBeobachter (Observer $ Beobachter) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ Beobachter) {unset ($ this-> _observerList [$ key]); return true;}} return false;} / ** * Methode, Beobachter zu aktualisieren * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ OB-> update ($ newsHeadline);}} / ** * hinzufügen eine neue Nachrichten-Geschichte * * @ var string $ Geschichte * @ return void * / public function addNewsStory ($ Geschichte) {if (empty ($ Geschichte) | |! is_string ($ Geschichte)) {throw new InvalidArgumentException ("Erwartete eine News Geschichte ');} $ this-> updateObservers ($ Geschichte);}} Controller Script
<? Php / ** * Observer Design Pattern Beispiel * * @ Author Lloyd Watkin * @ Since 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / include 'observers.php'; include 'subject.php'; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Was tun wir? echo 'Observer-Muster Beispiel in PHP ". PHP_EOL; Echo'================================'. PHP_EOL; / / Setze dich unser Thema $ Subject = new ArticleAggregator (); echo '- ArticleAggregator geschaffen. " PHP_EOL; / / Hinzufügen einiger Beobachter $ Subject-> addObserver (neu wohltönende ()); $ Subject-> addObserver ($ gossiper = new GossipObserver ()); echo '- Hinzugefügt NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'NewsFlash: Promi-Rugby-Spieler liebt finanzieren. " PHP_EOL; Echo'================================================ '. PHP_EOL; $ Subject-> addNewsStory ('Celebrity Rugbyspieler finanzieren liebt'); Echo PHP_EOL; echo '- SportObserver hat und fand will, der Gruppe beizutreten! "; $ Subject-> addObserver (neu SportObserver ()); Echo PHP_EOL. PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'NewsFlash: Regierung wieder vermasselt!' . PHP_EOL; Echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ("Regierung wieder vermasselt! '); Echo PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'NewsFlash: Mode und Fußball zu verbinden. " PHP_EOL; Echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ("Mode und Fußball zu verbinden '); Echo PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'NewsFlash: Musik und Politik, was nun? " . PHP_EOL; Echo'=========================================='. PHP_EOL; $ Subject-> addNewsStory ("Musik und Politik, was nun? '); Echo PHP_EOL; / ** Klatschakteure * wachsen von Nachrichten sehr schnell müde entschieden haben * Zu stoppen hören, obwohl alle interessanten Nachrichten! * / echo '- GossipObserver langweilt sich und verlässt die Gruppe! " . PHP_EOL. PHP_EOL; $ Subject-> entferneBeobachter ($ gossiper); / / Piep, piep, piep ... News Flash - Update zu einer früheren Geschichte! echo 'Newsupdate: Mode und Fußball zu verbinden, sagt'. "Regierung". PHP_EOL; Echo'================================================ '. '========='. PHP_EOL; $ Subject-> addNewsStory ("Mode und Fußball zu verbinden." «, Sagt der Regierung '); Echo PHP_EOL; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}



















































Hallo,
Erstens, mein Englisch ist sehr schlecht, dann
Können Sie mir sagen, was ist das System auf dem Bild?
Fedora 12?
Was ist das Thema?
Hallo,
Können Sie mir sagen, was ist das System auf dem Bild?
Fedora 12?
Was ist das Thema?
Seine Fedora 11 mit KDE angewendet. Glasslooks Thema, glaube ich.