Design Patterns PHP - pattern Observateur

Par Steven Watkin Lloyd , Mardi 29 Décembre 2009 22h02

J'ai lu Head First Design Patterns récemment et ont décidé d'écrire quelques-uns des modèles comme exemples PHP pour mon propre bénéfice. Le premier que j'ai décidé de coder est le pattern Observateur . La définition formelle du modèle Observateur est la suivante:

Le modèle d'observateur (un sous-ensemble de l'asynchrone de publication / abonnement modèle ) est un logiciel de design pattern dans lequel un objet , appelé le sujet, tient à jour une liste de ses personnes à charge, les observateurs appelés, et les informe automatiquement de tout changement Etat, généralement par téléphone une de leurs méthodes . Il est principalement utilisé pour mettre en œuvre des systèmes distribués de gestion des événements.

Comme les systèmes de plus en plus faiblement couplés faire en sorte que lorsqu'un événement se produit tous les systèmes qui exigent des connaissances de ces mises à jour sont informés. Par exemple, un billet de blog, après avoir sauvé un poste nous pouvons avoir besoin de mettre à jour un moteur de recherche (par exemple, Lucene), mettre à jour notre plan du site, tags, e-mail les utilisateurs inscrits, etc Le modèle d'observation permet aux développeurs d'ajouter des écouteurs supplémentaires sans modifier leur objet observable . En injectant des observateurs (c.-à-un observateur mise à jour du moteur de recherche, un générateur de sitemap, etc) dans un objet (système de blog édition c.-à-poste), nous pouvons permettre à l'il d'effectuer toutes les mises à jour nécessaires sans aucune modification.

Avant le modèle Observateur a été identifié le truc habituel serait de mettre à jour l'objet observable avec une ligne de code supplémentaire pour mettre à jour le système requis, et en supprimant la ligne de code au besoin. Cela ne permet pas facilement ajouter et supprimer des observateurs.

Les mises à jour sous réserve de tous ses observateurs par une méthode de mise à jour. Cette méthode mise à jour appelle une méthode dans chaque observateur qui est dérivée de la mise en œuvre d'une interface. Les observateurs peuvent ajouter un se retirer par des méthodes dans l'objet observé.

C'est essentiellement cela! Je trouve toujours un exemple pour être la meilleure méthode d'apprentissage / compréhension voici donc mon exemple codé en place ...

Pattern Observateur en PHP

Dans mon exemple, j'ai créé un système de nouvelles (NewsAggregator) qui envoie des mises à jour des nouvelles à titre petits fils de nouvelles. Voici les nouvelles sytem prend la place de la réserve, observables, etc alors que les fils de nouvelles prennent le rôle des observateurs ou auditeurs.

Une fois initialisé observateurs peuvent se fixer et se détacher de l'objet comme ils l'entendent. Dans mon exemple, j'ai créé trois observateurs, ces scan les titres émis par la matière et "shout" les nouvelles si son cas. Les trois observateurs sont nommés ci-dessous avec les termes qu'ils scan pour quand titres de nouvelles de réception:

  • Sport Observateur: 'rugby', 'football', 'tennis'
  • Nouvelles Observateur: «politique», «financement», «gouvernement»
  • Gossip Observateur: «célébrités», «musique», «mode»

Après initalising l'objet-je ajouter les observateurs nouvelles et des potins et envoyer une mise à jour de nouvelles. Après cela, les observateurs du sport est ajouté, avant les mises à jour plus de nouvelles sont envoyés. Enfin, l'observateur le commérage est retirée avant un titre nouvelles final est envoyé.

Les trois classes différentes d'observateur implémenter l'interface Observer, ce qui leur donne une interface claire / méthode par laquelle ils recevront les mises à jour. Pourvu qu'ils implémentent l'interface Observateur ils seront en mesure de se joindre à la réserve. Ceci empêche également avec le paradigme de la programmation de «programme d'interfaces pas mises en œuvre. La classe NewsAggregator étend l'objet classe abstraite, qui nous fournit les trois nécessaires méthodes publiques:

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

Le code peut être vu ici en courant, Observateur Pattern en PHP course , et le code peut être téléchargé à partir d'ici, Observateur Pattern en PHP Code .

Observateur Script

  <? Php
 / **
  * Ce fichier contient les observateurs
  *
  * @ Author Lloyd Watkin
  * @ Since 2009/12/23
  * /

 Sous réserve de classe abstraite
 {
	 Résumé addObserver fonction publique (Observateur $ observateur);
	 Résumé removeObserver fonction publique (Observateur $ observateur);
	 Résumé updateObservers fonction publique ($ newsHeadline);
 }

 / **
  * C'est la classe objet pour l'exemple
  *
  * @ Author Lloyd Watkin
  * @ Since 2009/12/23
  * /
 Sous réserve de classe ArticleAggregator s'étend
 {
	 / **
	  * Titulaire d'une liste de nos observateurs
	  *
	  * @ Var array
	  * /
	 protégées _observerList $ = array ();

	 / **
	  * Méthode d'ajouter un observateur
	  *
	  * @ Var $ Observateur observateur
	  * @ return void
	  * /
	 addObserver fonction publique (Observateur $ observateur)
	 {
		 _observerList $ this-> [] = $ observateur;
	 }

	 / **
	  * Méthode pour enlever un observateur
	  *
	  * @ Var $ Observateur observateur
	  * @ return boolean
	  * /
	 removeObserver fonction publique (Observateur $ observateur)
	 {
		 foreach ($ this-> _observerList as $ key => $ ob) {
			 if ($ ob == $ observateur) {
				 unset ($ this-> _observerList [$ key]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Méthode de mettre à jour les observateurs
	  *
	  * @ Var string $ newsHeadline
	  * @ return void
	  * /
	 updateObservers fonction publique ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 mise à jour $ ob-> ($ newsHeadline);
		 }
	 }

	 / **
	  * Ajouter une histoire de nouvelles nouvelles
	  *
	  * @ Var string $ histoire
	  * @ return void
	  * /
	 addNewsStory fonction publique ($ article)
	 {
		 if (empty ($ article) | |! is_string ($ histoire)) {
			 jeter InvalidArgumentException nouvelle ('attendu une histoire nouvelles!');
		 }
		 $ This-> updateObservers ($ article);
	 }
 } 

Objet / Script observables

 <? Php / ** * Ce fichier contient l'objet * @ author Lloyd Watkin * @ since 2009/12/23 * / Sous réserve de classe abstraite {abstraite addObserver fonction publique (Observateur $ observateur); résumé removeObserver fonction publique (Observateur $ observateur ); résumé updateObservers fonction publique ($ newsHeadline);} / ** * Ceci est la classe objet pour l'exemple * * @ author Lloyd Watkin * @ since 2009/12/23 * / class ArticleAggregator s'étend Objet {/ ** * Dit une liste de nos * * * observateurs @ var array / protected $ _observerList = array (); / ** * Méthode d'ajouter un observateur * * * @ var $ Observateur observateur @ return void * / addObserver fonction publique (Observateur $ observateur) {_observerList $ this-> [] = $ observateur;} / ** * Méthode pour enlever un observateur * * * @ var $ Observateur observateur @ return boolean * / removeObserver fonction publique (Observateur $ observateur) {foreach ($ this-> clés _observerList AS $ => $ ob) {if ($ ob == $ observateur) {unset (_observerList $ this-> [$ key]); return true;}} return false;} / ** * Méthode de mettre à jour les observateurs * * @ var string $ * @ return newsHeadline void * / updateObservers fonction publique ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ jour ob-> ($ newsHeadline);}} / ** * Ajouter * une nouvelle histoire nouvelles * @ var string $ * @ return histoire void * / addNewsStory fonction publique ($ article) {if (empty ($ article) | |! is_string ($ histoire)) {throw InvalidArgumentException nouvelle ('attendait une nouvelles histoire ');} $ this-> updateObservers ($ article);}} 

Contrôleur Script

  <? Php
 / **
  * Exemple Pattern Observeur du design
  *
  * @ Author Lloyd Watkin
  * @ Since 2009/12/23
  http://www.evilprofessor.co.uk lien * @
  * /
 comprennent «observers.php;
 comprennent «subject.php;

 if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo '
 ";} / / Que faisons-nous?  echo 'Observateur Pattern Exemple en PHP.  PHP_EOL; echo'================================'.  PHP_EOL; / / Mise en place de notre Sujet $ subject = ArticleAggregator new (); echo '- ArticleAggregator créé.  PHP_EOL; / / Ajouter addObserver certains observateurs $ objet-> (nouveau NewsObserver ()); addObserver $ objet-> ($ gossiper = new GossipObserver ()); echo '- Ajouté NewsObverser & GossipObserver.  PHP_EOL.  PHP_EOL; / / Bip, bip, bip ...  Nouvelles éclair!  echo 'NewsFlash: joueur de rugby célébrité aime financement ».  PHP_EOL; echo'============================================== == '.  PHP_EOL; $ objet-> addNewsStory («joueur de rugby célébrité aime finance '); echo PHP_EOL; echo' - SportObserver a découvert et veut rejoindre le groupe!"; AddObserver $ objet-> (nouveau SportObserver ()); echo PHP_EOL .  PHP_EOL; / / Bip, bip, bip ...  Nouvelles éclair!  echo 'NewsFlash: Le gouvernement chamboule à nouveau!  .  PHP_EOL; echo'======================================='.  PHP_EOL; $ objet-> addNewsStory («gouvernement mess de nouveau!"); Echo PHP_EOL; / / Bip, bip, bip ...  Nouvelles éclair!  echo 'NewsFlash: combiner la mode et de football.  PHP_EOL; echo'======================================='.  PHP_EOL; $ objet-> addNewsStory («la mode et le football combiner '); echo PHP_EOL; / / Bip, bip, bip ...  Nouvelles éclair!  echo 'NewsFlash: musique et politique, et maintenant?  .  PHP_EOL; echo'=========================================='.  («Musique et politique, et maintenant?) $ Objet-> addNewsStory;; PHP_EOL écho PHP_EOL; / ** * commères se lasse pas de nouvelles très rapidement et ont décidé * d'arrêter d'écouter, en dépit de toutes les nouvelles intéressantes aujourd'hui!  * / Echo '- GossipObserver s'ennuie et quitte le groupe!  .  PHP_EOL.  PHP_EOL; $ objet-> removeObserver ($ gossiper); / / Bip, bip, bip ...  Nouvelles Flash - Mise à jour une histoire plus tôt!  echo 'NewsUpdate: la mode et le football combiner dit.  «Gouvernement».  PHP_EOL; echo'============================================== == '.  '========='.  PHP_EOL; $ objet-> addNewsStory («la mode et le football combiner 'affirme que le gouvernement".); Echo PHP_EOL; if (! Empty ($ _SERVER [' HTTP_USER_AGENT '])) {echo' 

»;

}

3 réponses à "PHP Design Patterns - pattern Observateur"

  1. Voeu dit:

    Bonjour,
    Premièrement, mon anglais est très pauvre, puis
    Pouvez-vous me dire quel est le système dans l'image?
    Fedora 12?
    Quel est le thème?

  2. Voeu dit:

    Bonjour,
    Pouvez-vous me dire quel est le système dans l'image?
    Fedora 12?
    Quel est le thème?

Laisser un commentaire













Thème par Panorama Themocracy

6 visiteurs en ligne maintenant
4 personnes, 2 bots, 0 membres
Maximum de visiteurs aujourd'hui: 15 à 08:24 UTC
Ce mois-ci: 26 au 05/07/2011 00:35 UTC
Cette année: 130 à 28-03-2011 10:40 pm UTC
Tous les temps: 130 à 28-03-2011 10:40 pm UTC