PHP Design Patterns - Observer Pattern
Я читал Head First шаблонов проектирования недавно и решили написать некоторые из моделей, как PHP, примеры для моего собственного блага. Первое, что я решил код на это наблюдатель Pattern . Формальное определение шаблона наблюдателя является:
Наблюдатель шаблон (подмножество асинхронных публикации / подписки шаблон ) является программным обеспечением шаблон дизайна , в котором объект , называемый предмет, сохраняет список своих иждивенцев, называемых наблюдателей, и уведомляет их автоматически любых изменений состояния, как правило, по телефону одним из их методов . Он в основном используется для реализации распределенных систем обработки событий.
Как системы становятся все более слабо связанные убедившись, что, когда происходит событие все системы, которые требуют знания эти обновления сообщается. Например, сообщение в блоге, после сохранения записи мы, возможно, потребуется обновление поисковой системы (например, Lucene), обновляем нашу карту сайта, теги, электронной почты подписались пользователей и т. д. наблюдателя закономерность позволяет разработчикам добавлять дополнительные приемники, не редактируя их наблюдаемого объекта . Вводя наблюдателей (т.е. поисковой системы обновления наблюдателя, генератор карты сайта и т.д.) в предмет (например, сообщение в блоге редактирования системы) мы можем позволить ей выполнять все необходимые обновления без каких-либо изменений.
Перед наблюдателя картина была выявлена обычный прием будет обновить наблюдаемого объекта с дополнительной строки кода для обновления требуется система, и удаления строки кода по мере необходимости. Это не позволяет с легкостью добавлять и удалять наблюдателей.
Тема обновления всех своих наблюдателей через метод обновления. Это обновление метод вызывает метод в каждом наблюдателя, который является производным от реализации интерфейса. Наблюдатели могут добавлять удалять себя через методы в наблюдаемый объект.
Это в основном это! Я всегда нахожу пример для лучший метод обучения / понимание так вот мой закодированных на примере ...
Наблюдатель Pattern в PHP
В моем примере я создал новости системы (NewsAggregator), который посылает обновление заголовков новостей более мелкие каналы новостей. Здесь новости системном занимает место субъекта, Наблюдаемые и т.д. в то время как новостные ленты взять на себя роль наблюдателя или слушателей.
После инициализации наблюдатели могут подключения и отключения себя от субъекта как они считают нужным. В моем примере я создал три наблюдателя, эти проверки заголовков разослал субъекта и 'кричать' новость, если ее необходимости. Трех наблюдателей названы ниже наряду с условиями, которые они сканирования при получении новостей:
- Спорт Observer: "регби", "футбол", "теннис"
- Новости Observer: «политика», «финансы», «правительство»
- Сплетни Observer: 'знаменитости', 'Музыка', 'мода'
После initalising тему я добавляю новости и сплетни наблюдателей и посылают новостей. После этого спорта наблюдателя добавляется перед более обновления новостей будут отправлены. Наконец сплетни наблюдатель удаляется до окончательного заголовки новостей отправляется.
Три различных класса наблюдателя реализовать интерфейс наблюдателя, это дает им понятный интерфейс / метод, через который они будут получать обновления. При условии, они реализуют интерфейс наблюдателя, они смогут присоединиться к этому вопросу. Это также идет в ногу со программирования парадигмы 'для интерфейсов не реализаций. NewsAggregator класс расширяет абстрактный класс Тема, которая дает нам три обязательных общедоступных методов:
- updateObservers ()
- addObserver ()
- removeObserver ()
Код можно увидеть работающий здесь, наблюдатель Pattern в PHP Запуск , а код можно загрузить отсюда, наблюдатель Pattern в коде PHP .
Наблюдатель сценарий
<? PHP / ** * Этот файл содержит наблюдателей * * @ Автор Ллойд Уоткин * @ С 2009/12/23 * / Тема абстрактных классов { абстрактные общественные addObserver функции (наблюдатель от $ наблюдателя); абстрактные общественные removeObserver функции (наблюдатель от $ наблюдателя); абстрактные общественные updateObservers функции ($ newsHeadline); } / ** * Это является предметом класс для примера * * @ Автор Ллойд Уоткин * @ С 2009/12/23 * / Класс ArticleAggregator расширяет Тема { / ** * Содержит список наших наблюдателей * * @ Уаг массив * / защищенный $ _observerList = Array (); / ** * Метод добавить наблюдателя * * @ $ Уаг наблюдателя наблюдателя * @ Возвращается тщетным * / общественных addObserver функции (наблюдатель $ наблюдателя) { $ Это-> _observerList [] = $ наблюдателя; } / ** * Метод для удаления наблюдателя * * @ $ Уаг наблюдателя наблюдателя * @ Возвращения логическое * / общественных removeObserver функции (наблюдатель $ наблюдателя) { Еогеасп ($ этом-> _observerList AS $ ключ => $ оЬ) { если ($ Обь == $ наблюдателя) { установлена ($ этом-> _observerList [$ ключевых]); возвращение правда; } } вернуться ложным; } / ** * Метод обновления наблюдателей * * @ Уаг строки $ newsHeadline * @ Возвращается тщетным * / общественных updateObservers функции ($ newsHeadline) { Еогеасп ($ этом-> _observerList AS $ оЬ) { $ Обь-> обновления ($ newsHeadline); } } / ** * Добавить новую новость * * @ Уаг строки $ историю * @ Возвращается тщетным * / общественных addNewsStory функции ($ истории) { если (пусто ($ история) | |! is_string ($ история)) { пролить новый InvalidArgumentException («Ожидаемые новости история! '); } $ Это-> updateObservers ($ истории); } }
Тема / Наблюдаемые сценарий
<? PHP / ** * Этот файл содержит тему * * @ Автор Ллойд Уоткин * @ С 2009/12/23 * / Тема абстрактных классов { абстрактные общественные addObserver функции (наблюдатель от $ наблюдателя); абстрактные общественные removeObserver функции (наблюдатель от $ наблюдателя); абстрактные общественные updateObservers функции ($ newsHeadline); } / ** * Это является предметом класс для примера * * @ Автор Ллойд Уоткин * @ С 2009/12/23 * / Класс ArticleAggregator расширяет Тема { / ** * Содержит список наших наблюдателей * * @ Уаг массив * / защищенный $ _observerList = Array (); / ** * Метод добавить наблюдателя * * @ $ Уаг наблюдателя наблюдателя * @ Возвращается тщетным * / общественных addObserver функции (наблюдатель $ наблюдателя) { $ Это-> _observerList [] = $ наблюдателя; } / ** * Метод для удаления наблюдателя * * @ $ Уаг наблюдателя наблюдателя * @ Возвращения логическое * / общественных removeObserver функции (наблюдатель $ наблюдателя) { Еогеасп ($ этом-> _observerList AS $ ключ => $ оЬ) { если ($ Обь == $ наблюдателя) { установлена ($ этом-> _observerList [$ ключевых]); возвращение правда; } } вернуться ложным; } / ** * Метод обновления наблюдателей * * @ Уаг строки $ newsHeadline * @ Возвращается тщетным * / общественных updateObservers функции ($ newsHeadline) { Еогеасп ($ этом-> _observerList AS $ оЬ) { $ Обь-> обновления ($ newsHeadline); } } / ** * Добавить новую новость * * @ Уаг строки $ историю * @ Возвращается тщетным * / общественных addNewsStory функции ($ истории) { если (пусто ($ история) | |! is_string ($ история)) { пролить новый InvalidArgumentException («Ожидаемые новости история! '); } $ Это-> updateObservers ($ истории); } }
Скрипт контроллера
<? PHP / ** * Наблюдатель Design Pattern Пример * * @ Автор Ллойд Уоткин * @ С 2009/12/23 * @ Ссылка http://www.evilprofessor.co.uk * / включают "observers.php '; включают "subject.php '; если (! пустым ($ _SERVER ['HTTP_USER_AGENT'])) { эхо "'; } / / Что мы делаем? Эхо «Наблюдателя шаблон Пример на PHP. PHP_EOL; эхо'================================'. PHP_EOL; / / Установка нашей теме $ Тема = новое ArticleAggregator (); эхо '- ArticleAggregator создан. PHP_EOL; / / Добавляем некоторые наблюдатели $ Субъект-> addObserver (новые NewsObserver ()); $ Субъект-> addObserver ($ болтунья = новый GossipObserver ()); эхо '- Добавлена NewsObverser & GossipObserver. PHP_EOL. PHP_EOL; / / Бип, бип, бип ... Экстренный выпуск! эхо "NewsFlash: знаменитости регбист любит финансов. PHP_EOL; эхо'================================================ ». PHP_EOL; $ Субъект-> addNewsStory ('знаменитости регбист любит финансы'); эхо PHP_EOL; эхо '- SportObserver обнаружил и хочет присоединиться к группе!'; $ Субъект-> addObserver (новые SportObserver ()); эхо PHP_EOL. PHP_EOL; / / Бип, бип, бип ... Экстренный выпуск! эхо "NewsFlash: правительство столовых снова! . PHP_EOL; эхо'======================================='. PHP_EOL; $ Субъект-> addNewsStory ('правительство портит снова!'); эхо PHP_EOL; / / Бип, бип, бип ... Экстренный выпуск! эхо "NewsFlash: мода и футбол объединить. PHP_EOL; эхо'======================================='. PHP_EOL; $ Субъект-> addNewsStory (мода и футбол объединить '); эхо PHP_EOL; / / Бип, бип, бип ... Экстренный выпуск! эхо "NewsFlash: музыка и политика, а что дальше? . PHP_EOL; эхо'=========================================='. PHP_EOL; $ Субъект-> addNewsStory («музыка и политика, а что дальше? '); эхо PHP_EOL; / ** * Сплетники устают новостей очень быстро, и решили * Прекратить слушать, несмотря на все интересные новости сегодня! * / эхо '- GossipObserver скучает и покидает группу! . PHP_EOL. PHP_EOL; $ Субъект-> removeObserver ($ болтунья); / / Бип, бип, бип ... Новости Flash - обновление на более раннюю историю! эхо "NewsUpdate: мода и футбол объединить говорит. «Правительство». PHP_EOL; эхо'================================================ ». '========='. PHP_EOL; $ Субъект-> addNewsStory (мода и футбол объединить. "Правительство говорит, '); эхо PHP_EOL; если (! пустым ($ _SERVER ['HTTP_USER_AGENT'])) { эхо "';
}


















































Добрый день,
Во-первых, мой английский очень плохим, то
Можете ли вы сказать мне, что система в картине?
Fedora 12?
Что такое тема?
Добрый день,
Можете ли вы сказать мне, что система в картине?
Fedora 12?
Что такое тема?
Его Fedora 11 с KDE применяется. Glasslooks тему я верю.