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 тэму я веру.