PHP Design Patterns - спостерігач "

За Стівен Ллойд Уоткін , у вівторок 29 грудня 2009 10:02 вечора

Я читав Head First Design Patterns недавно і вирішили написати кілька моделей як приклади PHP для мого власного блага. Перше, що я вирішив код на це спостерігач " . Формальне визначення шаблону спостерігача є:

Спостерігач картини (підмножина асинхронних публікація / підписка картини ) є програмним забезпеченням шаблон дизайну , в якому об'єкт , називається предмет, підтримує список своїх утриманців, званих спостерігачів, і повідомляє їх автоматично будь-яких змін стану, як правило, по телефону один з їх методів . Він в основному використовується для реалізації розподілених систем обробки подій.

Оскільки системи стають більш слабко пов'язані переконавшись, що, коли подія відбувається всі системи, які вимагають знання ці оновлення в повідомленні. Наприклад, у блозі, після збереження посади ми, можливо, буде потрібно оновлення пошукової системи (наприклад Lucene), оновлена ​​карта сайту, теги, електронної пошти підписка користувачів і т.д. спостерігача шаблон дозволяє розробникам додавати додаткові слухачів без редагування їх спостережуваного об'єкта . Вводячи спостерігачів (тобто оновлення пошукової спостерігача, Sitemap Generator, і т.д.) в темі (тобто системи після редагування блог) ми можемо дозволити їй виконувати всі необхідні оновлення без будь-яких змін.

Перш ніж картина спостерігачів був визначений звичайний прийом буде оновлювати спостережуваного об'єкта з додатковою рядки коду для оновлення потрібна система, і видалення рядка коду в міру необхідності. Це не дозволяє легко додавання та видалення спостерігачів.

Предмет оновлення всіх своїх спостерігачів за допомогою методу оновлення. Це оновлення метод викликає метод у кожному спостерігача, який є похідним від реалізації інтерфейсу. Спостерігачі можуть додати видалити себе з допомогою методів у спостережуваного об'єкта.

Це в основному це! Я завжди знайдете приклад для кращий метод навчання / розуміння так от мій закодовані на прикладі ...

Спостерігач "в PHP

У моєму прикладі я створив систему новин (NewsAggregator), яка посилає заголовок відновлення новин менше новин. Тут новини системному займає місце суб'єкта, що спостерігається, і т.д. в той час як новинні стрічки взяти на себе роль спостерігачів або слухачів.

Після ініціалізації спостерігачів можна прикріпити і відокремлюватися від предмета, як вони вважають за потрібне. У моєму прикладі я створив три спостерігача, ці перевірки заголовків розіслав суб'єкта і 'рупор' новини, якщо його необхідності. Три спостерігача названі нижче, разом з умовами, які вони сканування при отриманні заголовків новин:

  • Спорт спостерігачів: "регбі", "футбол", "теніс"
  • Новини Observer: "політиці", "Фінанси", "уряд"
  • Плітки спостерігачів: "знаменитості", "Музика", "мода"

Після initalising предметом додати новини і плітки спостерігачів і відправити новин. Після цього спорту спостерігач додати перед більш відновлення новин розіслані. Нарешті плітки спостерігач видаляється до остаточного заголовок новини відправляється.

Три різних класу спостерігача реалізації інтерфейсу спостерігачів, це дає їм зрозумілий інтерфейс / метод за допомогою якого вони будуть отримувати оновлення. Якщо вони реалізують інтерфейс спостерігача вони зможуть долучитися до цього питання. Це також йде в ногу з програмування парадигма 'для інтерфейсів не реалізацій. Клас NewsAggregator розширює абстрактний суб'єкт, який надає нам три обов'язкових загальнодоступних методів:

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

Код можна побачити тут працює, спостерігач "в PHP Запуск , і код може бути завантажений звідси, спостерігач "в PHP код .

Спостерігач сценарію

 ? <PHP / ** * Цей файл містить * спостерігачів * @ автор Ллойд Уоткін * @ з 2009/12/23 * / абстрактний суб'єкт класу {абстрактної суспільної addObserver функції (спостерігач від $ спостерігача); абстрактної суспільної removeObserver функції (спостерігач від $ спостерігача ); абстрактної суспільної updateObservers функції ($ newsHeadline);} / ** * Це є предметом класу на прикладі * * @ автор Ллойд Уоткін * @ з 2009/12/23 * / клас ArticleAggregator розширює Тема {/ ** * Постановляє Список наших спостерігачів * * @ VAR масиву * / $ охоронюваних _observerList = Array (); / ** * метод, щоб додати спостерігач * * @ VAR спостерігачів $ спостерігача * @ повернення недійсними * / Зв'язки з громадськістю addObserver функції (спостерігач від $ спостерігача) {$ ЬИз-> _observerList [] = $ спостерігача;} / ** * метод видалення спостерігача * * @ VAR спостерігачів $ спостерігача * @ повернення булево * / Зв'язки з громадськістю removeObserver функції (спостерігач від $ спостерігача) {Еогеасп ($ цьому-> _observerList AS $ ключ => $ ОВ) {якщо ($ OB == $ спостерігача) {відключене ($ цьому-> _observerList [$ ключових]); повернення TRUE;}} повернення хибним;} / ** * Метод поновлення спостерігачів * * @ VAR рядка $ newsHeadline * @ повернення недійсними * / Зв'язки з громадськістю updateObservers функції ($ newsHeadline) {Еогеасп ($ цьому-> _observerList AS $ ОВ) {$ Об-> Update ($ newsHeadline);}} / ** * Додати нова новина * * @ VAR рядка $ історію * @ повернення недійсними * / Зв'язки з громадськістю addNewsStory функції ($ історія) {якщо (пусто ($ історія) | |! is_string ($ історія)) {певд InvalidArgumentException ("Очікувані новини Історія ');} $ цій-> updateObservers ($ історії);}} 

Тема / Спостережувані сценарію

 ? <PHP / ** * Цей файл містить тему * * @ автор Ллойд Уоткін * @ з 2009/12/23 * / абстрактний суб'єкт класу {абстрактної суспільної addObserver функції (спостерігач від $ спостерігача); абстрактної суспільної removeObserver функції (спостерігач від $ спостерігача ); абстрактної суспільної updateObservers функції ($ newsHeadline);} / ** * Це є предметом класу на прикладі * * @ автор Ллойд Уоткін * @ з 2009/12/23 * / клас ArticleAggregator розширює Тема {/ ** * Постановляє Список наших спостерігачів * * @ VAR масиву * / $ охоронюваних _observerList = Array (); / ** * метод, щоб додати спостерігач * * @ VAR спостерігачів $ спостерігача * @ повернення недійсними * / Зв'язки з громадськістю addObserver функції (спостерігач від $ спостерігача) {$ ЬИз-> _observerList [] = $ спостерігача;} / ** * метод видалення спостерігача * * @ VAR спостерігачів $ спостерігача * @ повернення булево * / Зв'язки з громадськістю removeObserver функції (спостерігач від $ спостерігача) {Еогеасп ($ цьому-> _observerList AS $ ключ => $ ОВ) {якщо ($ OB == $ спостерігача) {відключене ($ цьому-> _observerList [$ ключових]); повернення TRUE;}} повернення хибним;} / ** * Метод поновлення спостерігачів * * @ VAR рядка $ newsHeadline * @ повернення недійсними * / Зв'язки з громадськістю updateObservers функції ($ newsHeadline) {Еогеасп ($ цьому-> _observerList AS $ ОВ) {$ Об-> Update ($ newsHeadline);}} / ** * Додати нова новина * * @ VAR рядка $ історію * @ повернення недійсними * / Зв'язки з громадськістю addNewsStory функції ($ історія) {якщо (пусто ($ історія) | |! is_string ($ історія)) {певд InvalidArgumentException ("Очікувані новини Історія ');} $ цій-> updateObservers ($ історії);}} 

Скрипт контролера

  <? PHP
 / **
  * Спостерігачів шаблон проектування Приклад
  *
  * @ Автор Ллойд Уоткін
  * @ З 2009/12/23
  * @ Посилання http://www.evilprofessor.co.uk
  * /
 включають "observers.php;
 включають "subject.php;

 якщо (! пусто ($ ['HTTP_USER_AGENT'] _SERVER)) {
     луна "
  ';
 }

 / / Що ми робимо?
 Ехо "спостерігач" Приклад в PHP.  PHP_EOL;
 Ехо'================================'.  PHP_EOL;
 / / Установка нашої теми
 $ Subject = новий ArticleAggregator ();
 Ехо "- ArticleAggregator створено".  PHP_EOL;

 / / Додавання деяких спостерігачів
 $ Предмета> addObserver (новий NewsObserver ());
 $ Предмета> addObserver ($ брехуха = новий GossipObserver ());

 луна '- Додана NewsObverser і GossipObserver.
	  PHP_EOL.  PHP_EOL;

 / / Beep, біп, біп ...  Новини Flash!
 Ехо "Останні новини: знаменитості регбіст любить фінансування.  PHP_EOL;
 Ехо'================================================ '.  PHP_EOL;
 $ Предмета> addNewsStory ("Гравець знаменитість любить регбі фінанси");
 Ехо PHP_EOL;

 Ехо "- SportObserver виявив і хоче приєднатися до групи! ';
 $ Предмета> addObserver (новий SportObserver ());
 Ехо PHP_EOL.  PHP_EOL;

 / / Beep, біп, біп ...  Новини Flash!
 Ехо "Останні новини: уряд їдалень знову!  .  PHP_EOL;
 Ехо'======================================='.  PHP_EOL;
 $ Предмета> addNewsStory ("уряд їдалень знову! ');
 Ехо PHP_EOL;

 / / Beep, біп, біп ...  Новини Flash!
 Ехо "Останні новини: мода і футбол об'єднати.  PHP_EOL;
 Ехо'======================================='.  PHP_EOL;
 $ Предмета> addNewsStory (мода і футбол комбінат ");
 Ехо PHP_EOL;

 / / Beep, біп, біп ...  Новини Flash!
 Ехо "Останні новини: музика і політика, а що далі?"  .  PHP_EOL;
 Ехо'=========================================='.  PHP_EOL;
 $ Предмета> addNewsStory ("Музика і політика, а що далі? ');
 Ехо PHP_EOL;

 / **
  * Пліткарів втомлюються новини дуже швидко, і вирішили
  * Щоб зупинити відтворення музики, незважаючи на всі цікаві новини сьогодні!
  * /
 Ехо "- GossipObserver нудно і покидає групу!  .
      PHP_EOL.  PHP_EOL;
 $ Предмета> removeObserver ($ брехуха);

 / / Beep, біп, біп ...  Новини Flash - оновлення для раніше історія!
 Ехо "NewsUpdate: мода і футбол об'єднати говорить.
      "Уряд".  PHP_EOL;
 Ехо'================================================ '.
      '========='.  PHP_EOL;
 $ Предмета> addNewsStory (мода і футбол комбінат ".
                         "Уряд говорить, ');
 Ехо PHP_EOL;

 якщо (! пусто ($ ['HTTP_USER_AGENT'] _SERVER)) {
     луна " 

';

}

3 Відповіді на "PHP Design Patterns - спостерігач" "

  1. Клятва каже:

    Здравствуйте,
    По-перше, мій англійська дуже погано, то
    Чи можете ви сказати мені, що системи на картинці?
    Fedora 12?
    Що таке тема?

  2. Клятва каже:

    Здравствуйте,
    Чи можете ви сказати мені, що системи на картинці?
    Fedora 12?
    Що таке тема?

Написати відповідь













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

6 відвідувачів зараз
4 гостей, 2 ботів, 0 користувачів
Макс відвідувачів сьогодні: 11: 02:18 AM UTC
У цьому місяці: 22 в 08-06-2011 12:30 ранку UTC
У цьому році: 130 в 28-03-2011 10:40 вечора UTC
За весь час: 130 в 28-03-2011 10:40 вечора UTC