PHP Дизајн Модели - Обсервер моделот

Со Стивен Лојд Watkin , Вторник 29 Декември 2009 година 22:02

Сум бил читање глава прва дизајн обрасци неодамна и се решив да напишам некои од моделите што се PHP примери за мојата сопствена корист. Првиот што решив да се нагоре кодот е Обсервер "моделот . Формалната дефиниција за расчистување на моделот е:

Набљудувачот шема (подмножество на асинхрони објавуваат / претплатите модел ) е софтвер дизајн моделот во кој објект , наречен оваа тема, одржува листа на издржуваат, наречен набљудувачи, и ги известува автоматски на секоја држава се менува, најчесто со повикување на еден од нивните методи . Тоа главно се користи за спроведување на дистрибуирани настан ракување со системи.

Како што се системи станат лабаво заедно што си сигурен дека кога некој настан што се случува сите системи кои бараат знаење од овие надградби се информирани. На пример, на блог пост, по зачувување на еден пост ни бидат потребни за да обновите некој пребарувач (пр. Lucene), ажурирање на нашата мапа на сајтот, тагови, e-mail претплатени корисници, итн набљудувач модел им овозможува на програмерите да додадете дополнителни слушатели без уредување на нивните забележливи објект . Со инјектирање на набљудувачите (т.е. пребарувач ажурирање набљудувач, карта генератор, итн) во предмет (т.е. блог пост уредување систем) можеме да му дозволиме на тоа да ги изврши сите потребни надградби, без какви било промени.

Пред моделот Обсервер беше идентификуван од вообичаените трик ќе биде да се ажурира видливи објект со соодветни линија од кодот да се ажурира потребните систем, и отстранување на линија код како што се бара. Ова не дозволува лесно додавање и отстранување на набљудувачи.

Предмет надградби на сите свои набљудувачи преку надградба метод. Ова ажурирање метод нарекува метод во секој набљудувач кој е изведен од имплементација на интерфејсот. Набљудувачите да додадете самите преку отстрани методи во забележителен објект.

Тоа е основа на тоа! Јас секогаш го најдете пример да се биде најдобар метод за учење / разбирање па еве го мојот пример се кодирани ...

Набљудувач на моделот во PHP

Во мојот пример јас сум создаден на прес-систем (NewsAggregator), кој испраќа вести насловни новости за помали вести. Овде вести sytem го зема местото на Субјектот видливи, со оглед на тоа итн вести преземе улогата на набљудувачите или слушатели.

Откако initialised набљудувачи може да се закачите и оттргнете се од темата како што им одговара. Во мојот пример имам креирано три набљудувачи, овие скенирање на наслови испратен од страна на субјектот и 'викам "вестите ако е соодветно. Трите набљудувачи се наведени подолу, заедно со термини, тие се скенира за при прием вести:

  • Спорт Обсервер ":" рагби "," фудбал "," тенис "
  • Вести Обсервер ":" политиката "," финансии "," владата "
  • Славна Обсервер ":" славна личност "," музика "," мода "

По initalising предмет да додадам на вести и озборувања набљудувачи и испратите ажурирање на вести. По ова овој спорт набљудувач се додава пред повеќе вести се испраќаат надвор. И на крај на озборувањата набљудувач се отстранува пред да донесе конечна вести насловни е испратена.

На три различни класи набљудувач имплементира интерфејс Обсервер ", ова им дава јасна интерфејс / метод преку кој тие ќе добијат ажурирања. Под услов тие да спроведат интерфејс Обсервер тие ќе бидат во состојба да се закачите на Субјектот. Ова исто така води со програмирање парадигма на програма за интерфејси не имплементации. Класата NewsAggregator се протега на апстрактни класа Тема, која ни овозможува потребни три јавни методи:

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

На кодот може да се види трчање тука, набљудувач на моделот во PHP Трчање , и кодот може да се симне од тука, набљудувач на моделот во PHP код .

Обсервер "сценарио

  <? Php
 / **
  * Оваа податотека содржи набљудувачите
  *
  * @ Author Лојд Watkin
  * @ Бидејќи 2009/12/23
  * /

 апстрактна класа Тема
 {
	 апстрактни јавна функција addObserver (Обсервер $ набљудувач);
	 апстрактни јавна функција removeObserver (Обсервер $ набљудувач);
	 апстрактни јавна функција updateObservers ($ newsHeadline);
 }

 / **
  * Ова е предмет класа за пример
  *
  * @ Author Лојд Watkin
  * @ Бидејќи 2009/12/23
  * /
 класа ArticleAggregator протега Тема
 {
	 / **
	  * Поседува листа на нашите набљудувачи
	  *
	  * @ Var низа
	  * /
	 заштитени $ _observerList = array ();

	 / **
	  * Метод за да додадете набљудувач
	  *
	  * @ Var $ Обсервер набљудувач
	  * @ Враќање пори
	  * /
	 јавна функција addObserver (Обсервер $ набљудувач)
	 {
		 $ Ова-> _observerList [] = $ набљудувач;
	 }

	 / **
	  * Метод за отстранување на набљудувач
	  *
	  * @ Var $ Обсервер набљудувач
	  * @ Врати логичка
	  * /
	 јавна функција removeObserver (Обсервер $ набљудувач)
	 {
		 foreach ($ ова-> _observerList како $ клучни => $ ob) {
			 ако ($ ob == $ набљудувач) {
				 размести ($ ова-> _observerList [$ клучните]);
				 враќање вистина;
			 }
		 }
		 return false;
	 }

	 / **
	  * Метод да се ажурира набљудувачи
	  *
	  * @ Var $ string newsHeadline
	  * @ Враќање пори
	  * /
	 јавна функција updateObservers ($ newsHeadline)
	 {
		 foreach ($ ова-> _observerList како $ ob) {
			 $ Ob-> ажурирање ($ newsHeadline);
		 }
	 }

	 / **
	  * Додадете нова вест
	  *
	  * @ Var $ string приказна
	  * @ Враќање пори
	  * /
	 јавна функција addNewsStory ($ приказна)
	 {
		 ако (празен ($ приказна) | |! is_string ($ приказна)) {
			 фрли нова InvalidArgumentException ("Очекував вест! ');
		 }
		 $ Ова-> updateObservers ($ приказна);
	 }
 } 

Тема / видливи сценарио

 ? <Php / ** * Оваа податотека содржи предметот * * @ author Лојд Watkin * @ бидејќи 2009/12/23 * / апстрактна класа Предмет {апстрактен јавна функција addObserver (Обсервер $ набљудувач), апстрактен јавна функција removeObserver (Обсервер $ набљудувач ); апстрактни јавна функција updateObservers ($ newsHeadline);} / ** * Ова е тема за класа на пример * @ author Лојд Watkin * @ бидејќи 2009/12/23 * / класа ArticleAggregator протега Предмет {/ ** * Утврди список на нашите набљудувачи * * @ var низа * / заштитени $ _observerList = array (); / ** * метод за да додадете набљудувач * * @ var $ Обсервер набљудувач * @ враќање пори * / јавна функција addObserver (Обсервер $ набљудувач) {$ ова-> _observerList [] = $ набљудувач;} / ** * метод за отстранување на набљудувач * * @ var $ Обсервер набљудувач * @ врати логичка * / јавна функција removeObserver (Обсервер $ набљудувач) {foreach ($ ова-> _observerList како $ клучни => $ ob) {if ($ ob == $ набљудувач) {размести ($ ова-> _observerList [$ клучните]); врати вистина;}} return false;} / ** * Метод да се ажурира набљудувачи * * @ var $ string newsHeadline * @ враќање пори * / јавна функција updateObservers ($ newsHeadline) {foreach ($ ова-> _observerList како $ ob) {$ ob-> ажурирање ($ newsHeadline);}} / ** * Додадете нова вест * * @ var $ string приказна * @ враќање пори * / јавна функција addNewsStory ($ приказна) {if (празен ($ приказна) | |! is_string ($ приказна)) {фрли нова InvalidArgumentException ("Очекував вести приказната ');!} $ ова-> updateObservers ($ приказна);}} 

Контролорот сценарио

  <? Php
 / **
  * Обсервер дизајн на моделот Пример
  *
  * @ Author Лојд Watkin
  * @ Бидејќи 2009/12/23
  * @ Врска http://www.evilprofessor.co.uk
  * /
 се 'observers.php';
 се 'subject.php';

 if (! празен ($ ['HTTP_USER_AGENT'] _SERVER)) {
     ехо "
  ';
 }

 / / Што правиме?
 ехо "Обсервер моделот Пример во PHP.  PHP_EOL;
 '================================' ехо.  PHP_EOL;
 / / Поставете нашиот предмет
 $ Предмет = new ArticleAggregator ();
 ехо "- ArticleAggregator создаде".  PHP_EOL;

 / / Додај некои набљудувачи
 $ Субјект-> addObserver (нова NewsObserver ());
 $ Субјект-> addObserver ($ = gossiper нови GossipObserver ());

 ехо "- Додадено NewsObverser & GossipObserver".
	  PHP_EOL.  PHP_EOL;

 / / Бип, звук, звук ...  Вести Флеш!
 ехо "Најново: славен рагби играч сака финансии".  PHP_EOL;
 ехо'================================================ '.  PHP_EOL;
 $ Субјект-> addNewsStory ("славна личност рагби играч сака финансии ');
 ехо PHP_EOL;

 ехо "- SportObserver го дознавме и сака да се присоединиш во групата! ';
 $ Субјект-> addObserver (нова SportObserver ());
 PHP_EOL ехо.  PHP_EOL;

 / / Бип, звук, звук ...  Вести Флеш!
 ехо "Најново: Владата мензи се повторно! '  .  PHP_EOL;
 '=======================================' ехо.  PHP_EOL;
 $ Субјект-> addNewsStory ("Владата мензи се повторно! ');
 ехо PHP_EOL;

 / / Бип, звук, звук ...  Вести Флеш!
 ехо "Најново: мода и фудбал комбинираат.  PHP_EOL;
 '=======================================' ехо.  PHP_EOL;
 $ Субјект-> addNewsStory ('модата и фудбал комбинираат');
 ехо PHP_EOL;

 / / Бип, звук, звук ...  Вести Флеш!
 ехо "Најново: музика и политика, што понатаму?"  .  PHP_EOL;
 '==========================================' ехо.  PHP_EOL;
 $ Субјект-> addNewsStory ('музика и политика, што е следно?');
 ехо PHP_EOL;

 / **
  * Gossipers расте уморни од вести и многу брзо да одлучи
  * Да престане да слуша, и покрај сите интересни вести денес!
  * /
 ехо "- GossipObserver е досадно и го остава во групата!  .
      PHP_EOL.  PHP_EOL;
 $ Субјект-> removeObserver ($ gossiper);

 / / Бип, звук, звук ...  Вести Флеш - надградба на претходната приказна!
 ехо "NewsUpdate: мода и фудбал комбинираат вели дека '.
      'Влада'.  PHP_EOL;
 ехо'================================================ '.
      '========='.  PHP_EOL;
 $ Субјект-> addNewsStory ('модата и фудбалот се комбинираат.
                         "Вели дека владата ');
 ехо PHP_EOL;

 if (! празен ($ ['HTTP_USER_AGENT'] _SERVER)) {
     ехо " 

';

}

3 Responses to "PHP Дизајн Модели - Обсервер" моделот "

  1. Завет вели:

    Здраво,
    Прво, мојот англиски е многу слаба, а потоа
    Можете ли да ми кажете што е системот на сликата?
    Fedora 12?
    Која е темата?

  2. Завет вели:

    Здраво,
    Можете ли да ми кажете што е системот на сликата?
    Fedora 12?
    Која е темата?

Оставете Одговори













Панорама Тема од Themocracy

4 посетители онлајн сега
3 Гости, 1-ботови, 0 членови
Макс посетители денес: 11 во 02:18 UTC
Овој месец: 22 во 2011/08/06 12:30 UTC
Оваа година: 28-03-2011 во 130 22:40 UTC
Сите времиња: 130 на 28-03-2011 10:40 UTC