PHP Design Patterns - назіральнік "
Я чытаў Head First Design Patterns нядаўна і вырашылі напісаць некалькі мадэляў у якасці прыкладаў PHP для майго ўласнага даброты. Першае, што я вырашыў код на гэта назіральнік " . Фармальнае вызначэнне шаблон назіральніка з'яўляецца:
Назіральнік карціны (падмноства асінхронных публікацыя / падпіска карціны ) з'яўляецца праграмным забеспячэннем шаблон дызайну , у якім аб'ект , называецца прадмет, падтрымлівае спіс сваіх утрыманцаў, званых назіральнікаў, і паведамляе іх аўтаматычна любых змяненняў стану, як правіла, па тэлефоне адзін з іх метадаў . Ён у асноўным выкарыстоўваецца для рэалізацыі размеркаваных сістэм апрацоўкі падзей.
Паколькі сістэмы становяцца больш слаба звязаныя пераканаўшыся, што, калі падзея адбываецца ўсё сістэмы, якія патрабуюць веды гэтыя абнаўлення ў паведамленні. Напрыклад, у блогу, пасля захавання пасады мы, магчыма, спатрэбіцца абнаўленне пошукавай сістэмы (напрыклад Lucene), абноўленая карта сайта, тэгі, электроннай пошты падпіска карыстальнікаў і г.д. назіральніка шаблон дазваляе распрацоўнікам дадаваць дадатковыя слухачоў без рэдагавання іх назіранага аб'екта . Уводзячы назіральнікаў (г.зн. абнаўленне пошукавай назіральніка, Sitemap Generator, і г.д.) у тэме (г.зн. сістэмы пасля рэдагавання блог) мы можам дазволіць ёй выконваць усе неабходныя абнаўлення без якіх-небудзь змяненняў.
Перш чым карціна назіральнікаў быў вызначаны звычайны прыём будзе абнаўляць назіранага аб'екта з дадатковай радкі кода для абнаўлення патрабуецца сістэма, і выдалення радкі кода па меры неабходнасці. Гэта не дазваляе лёгка дадання і выдалення назіральнікаў.
Прадмет абнаўлення ўсіх сваіх назіральнікаў з дапамогай метаду абнаўлення. Гэта абнаўленне метад выклікае метад у кожным назіральніка, які з'яўляецца вытворным ад рэалізацыі інтэрфейсу. Назіральнікі могуць дадаць выдаліць сябе з дапамогай метадаў у назіранага аб'екта.
Гэта ў асноўным гэта! Я заўсёды знойдзеце прыклад для лепшы метад навучання / разуменне так вось мой закадзіраваны на прыкладзе ...
Назіральнік "у PHP
У маім прыкладзе я стварыў сістэму навінаў (NewsAggregator), якая пасылае загаловак абнаўлення навін менш навін. Тут навіны сістэмным займае месца суб'екта, назіраная, і г.д. у той час як навінавыя стужкі ўзяць на сябе ролю назіральнікаў ці слухачоў.
Пасля ініцыялізацыі назіральнікаў можна прымацаваць і аддзяляцца ад прадмета, як яны лічаць патрэбным. У маім прыкладзе я стварыў тры назіральніка, гэтыя праверкі загалоўкаў разаслаў суб'екта і 'рупар' навіны, калі яго неабходнасці. Тры назіральніка названыя ніжэй, разам з умовамі, якія яны сканавання пры атрыманні загалоўкаў навін:
- Спорт назіральнікаў: "рэгбі", "футбол", "тэніс"
- Навіны Observer: "палітыцы", "Фінансы", "ўрад"
- Плёткі назіральнікаў: "знакамітасці", "Музыка", "мода"
Пасля initalising прадметам дадаць навіны і плёткі назіральнікаў і адправіць навін. Пасля гэтага спорту назіральнік дадаць перад больш абнаўлення навін разасланыя. Нарэшце плёткі назіральнік выдаляецца да канчатковага загаловак навіны адпраўляецца.
Тры розных класа назіральніка рэалізацыі інтэрфейсу назіральнікаў, гэта дае ім зразумелы інтэрфейс / метад з дапамогай якога яны будуць атрымліваць абнаўлення. Калі яны рэалізуюць інтэрфейс назіральніка яны змогуць далучыцца да гэтага пытання. Гэта таксама ідзе ў нагу з праграмавання парадыгма 'для інтэрфейсаў не рэалізацый. Клас NewsAggregator пашырае абстрактны суб'ект, які дае нам тры абавязковых агульнадаступных метадаў:
- updateObservers ()
- addObserver ()
- 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; рэха'=========================================='. ("Музыка і палітыка, а што далей? ') $ Прадмета> addNewsStory;; PHP_EOL рэха PHP_EOL; / ** * пляткар стамляюцца навіны вельмі хутка і вырашылі *, каб спыніць прайграванне музыкі, нягледзячы на ўсе цікавыя навіны сёння! * Эхо '- GossipObserver сумна і пакідае групу! . PHP_EOL. PHP_EOL; $ прадмета> removeObserver ($ балбатуноў); / / Beep, БІП, БІП ... Навіны Flash - абнаўленне для раней гісторыя! Рэха "NewsUpdate: мода і футбол аб'яднаць кажа. "Урад". PHP_EOL; рэха'============================================== == '. '========='. PHP_EOL; $ прадмета> addNewsStory (мода і футбол камбінат "," кажа ўрад.); Эхо PHP_EOL, калі (! Пуста ($ ['HTTP_USER_AGENT'] _SERVER)) {рэха "';
}



















































Добры дзень,
Па-першае, мой англійская вельмі дрэнна, то
Ці можаце вы сказаць мне, што сістэмы на малюнку?
Fedora 12?
Што такое тэма?
Добры дзень,
Ці можаце вы сказаць мне, што сістэмы на малюнку?
Fedora 12?
Што такое тэма?
Яго Fedora 11 з KDE ўжываецца. Glasslooks тэму я лічу.