Design Patterns в PHP, развитие

Дизайн модели са представени на обществеността в Моделите Книгата Design (Ерих Гама, Ричард Хелм, Ралф Джонсън и Джон Vlissides (известна като "бандата на четиримата")). Основната концепция, представена във въведението, е проста. През годините на развитие на софтуер и Gamma другари открил някои модели ( "модели") дизайн, както и архитекти, които са изграждане на жилища и сгради, могат да проектират шаблони за оформление тоалетни или кухня строителство. С помощта на тези шаблони, или дизайн модели, можете да проектирате на качеството на сградата по-бързо. Същото важи и за разработка на софтуер.

Дизайн модели не са само удобен начин за по-бързо развитие на надежден софтуер, но и начин за капсулиране на големите идеи в разбираем начин. Например, можем да говорим за писане на система за съобщения, за да се гарантира лошо свързаност, както и че е възможно - по модел на наблюдател, но това ще означава едно и също нещо.

Трудно е да се докаже стойността на модели на малък пример. Те са по този начин често се появяват като прекомерната сложност на код, тъй като обикновено се проявяват в големи системи с голям брой на изходния код. В тази статия няма да бъдат разглеждани големи приложения, така че трябва да използвате въображението си да се прилагат принципите на пример (а не непременно точното му код) в техните големи приложения. Това не означава, че не трябва да се използват модели на малки приложения. Много приложения започват като малки и да се развият в големи, така че няма причина да не следват тези правила наведнъж.

Сега, когато стана малко по-ясно, какво дизайн модели, и за какво се използва, че е време да се премине към петте най-популярните модели на PHP 5 дизайн.

Модела завод (фабрика)

Много от моделите на дизайна на оригиналния Design Patterns книгата насърчи разхлабването на връзките. За да се разбере тази концепция, ние трябва да говорим за борбата откъдето много разработчици на големи системи. Проблемът възниква, когато част от кода и по-нататъшен опит за проследяване на влиянието на тази промяна на системата (а в най-лошия случай - наблюдението на каскадата от сривове в системата, които се предполага, че по никакъв начин с променения код не е свързано).

Проблемът е, тежки svzyazannosti. Функции и класове в една част от системата разчита твърде много на поведението и архитектурата на други функции и класове (в други части на системата). Тук желания шаблон, който ще позволи на класове, за да комуникират един с друг, но това ще се избегне твърде много от свързването им един към друг, което би довело до някои "преплитане" на кодови независими части.

В по-големите системи, все повече и повече обвързан с няколко основни класове. Проблеми могат да възникнат, когато се променя тези класове. Да предположим, че имаме класа на потребителя, която чете от файл. Ние трябва да го смените с друг клас, която чете от базата данни, но и в целия кодекс, отнасящи се до ktoroy клас четене от файл. Тук е полезно фабрика модел.

Модела фабрика - клас, който предлага методи за създаване на обекти. Вместо да използвате новия дизайн директно за създаване на обекти, които използваме фабрика класа. Целият код, който използва фабрично класа се променя автоматично.
В listinge1 пример за фабрично клас. Сървър Storn се състои от две части: в базата данни и да зададете на PHP-страници, за да добавите канали (на хранене), списък с искане за канал и получават статии, обвързани с конкретен канал.

И двете повиквания върнат един и същ обект. Когато използвате този Сингълтън в заявлението, една и съща връзка се използва винаги.
В по-малките приложения, можете да управлявате глобални променливи, но в големи приложения, които трябва да се избягва чрез използване на обектите и методите за достъп до ресурсите.

Модела на наблюдателя (наблюдател)

модел Наблюдател предлага още един начин да се избегне силната свързаност между устройствата. Този модел е проста: един обект прави самата наблюдава чрез добавяне на метод, който позволява на друг субект, наблюдателят, за да се регистрирате.
Когато наблюдавания обект се променя, тя изпраща уведомление за регистрирани наблюдатели. Какво се случва, след получаване на уведомлението за наблюдателя, не зависи от обекта на наблюдение. Резултатът е начин на комуникация между обектите без да се налага да се разбере защо.

Един прост пример - в списъка на потребителите на системата. Кодът на Обява 4 показва списък на потребителите, който изпраща уведомление, когато добавяте нови потребители. За този списък, следните наблюдателите, водещ регистър; при получаване на уведомлението показва съобщението.

Обява 4. Observer.php

Кодът на проба създава UserList и добавя UserListLogger като наблюдател. След това добавете нов посетител и UserListLogger уведомени за тази промяна.
Важно е да се разбере, че USERLIST не знае, че дървар ще направя. Възможно е да има една или повече наблюдатели, които ще направят нещо друго. Например, можете да направите наблюдател, който ще изпрати съобщение на новия потребител, приветства новодошлите.
Стойността на този подход - това UserList не знае нищо за обектите зависими от нея; Той се концентрира върху управлението на списъка на потребителите и изпраща известие, когато тя се променя.

Този модел не се ограничава до предмети, съхранявани в паметта. Той се използва за системи Message Queue базирани на бази данни (системи с опашки на база от данни за съобщения), които се използват в големи приложения.

Shain модел-на-команда (командна верига)

За да осъществи идеята за разхлабването на връзките модел Shain-на-команда изпраща съобщение, команда, искане, по някакъв начин, чрез набор от работещи. Всеки манипулатор решава дали той ще бъде в състояние да обработим тази заявка. Ако може, по искане се обработват и процеса на предаване спира. Можете да добавите / премахнете работещи без това да повлияе на други работещи. Обява 5 показва пример на този модел.

Обява 5. Chain.php

Кодът първо създава CommandChain обект и добавя два отбора да възразят срещу това. След това двата отбора започнаха да се види кой отговаря. Ако името на командата не съвпада с нито UserCommand, нито MailCommand, кодът работи на разстояние и нищо не се случва.

Модела Chain-на-команда може да бъде ценна при създаването разтегателен обработка архитектура заявка, която може да се използва за решаване на много проблеми.

Модела стратегия (стратегия)

Очакваме в последната стратегия модел. В този модел алгоритми са отстранени от тежките класове, така че те могат лесно да бъдат променени. Например, стратегия модел - това е опция, ако искате да промените начина, по класацията на страницата в търсачката. Ние разделяме търсачката на няколко части - едната минава през страниците, един нарежда всяка страница, както и повече една всевъзможни резултатите въз основа на класирането. Комплекс начин - да се съчетаят всички части в един клас. С помощта на модела стратегия, можем да вземат участие, който отговаря за класиране на страници в друг клас, и можете да промените механизма за класиране, без да пречи на останалата част от двигателя на кода за търсене.

В един прост пример в Обява 6 показва класа, списък на потребителите, която предоставя набор от потребителски метод за търсене на базата на приставка и пускания-комплект стратегии.

Обява 6. Strategy.php

В примера на един и същ списък на потребителите е принуден чрез две стратегии, и показва резултатите. В първия случай, стратегията на търсене на всички имена, "повече" от «J» (Джак, Лори и Меган). Втората стратегия избира имена на случаен принцип и по този начин води до различни резултати за различни писти. В нашия случай това е Анди и Меган.

Стратегия модел много добро за сложни системи за управление на данни, които се нуждаят от по-голяма гъвкавост в филтриране, търсене и обработка на данни.

Това са някои от най-често срещаните модели на дизайна, използвани в PHP-приложения. Много повече може да се намери в Моделите Книгата дизайн. Няма нужда да се плашим от модели за това как нещо мистично. Модели - един чудесен идеи, които можете да използвате при програмирането на всеки език и всяко ниво на професионални умения.

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

Много подобна на информацията от книгата: «PHP 5 Разширено ООП и Design Patterns Чрез Стиг Bakken, Andi Gutmans, Дерик Rethans»

Много добре написана.
Благодаря за превода.

но като че ли нищо сложно)
Опитвам

ние с нетърпение очакваме да продължим

Имам впечатлението, че този код

публично статично функция GET ()
статично $ db = нула;
ако ($ db == нула)
$ Db = нов DatabaseConnection ();
върне $ db;
>

винаги ще се върне на нова инстанция на DatabaseConnection ();
принуждавам да ми угоди

Грешите.
Опитайте да изпълните този код:
функция т ()
статично $ о = нула;
ако (is_null ($ о)) $ о = ранд (1, 1000);
>
върне $ о;
>

Грозната стрелки на класациите

Всеки, който не обича стрели - попитайте manibek!
Но сериозно: ако искате да помогне - да се направи по-добре, аз ще бъде поставен.

Супер, много интуитивно и лесно обяснимо. Благодаря за статията.

Измийте в Singleton правописна грешка
статично $ db = нула трябва да се научат от (метод GET) в описанието за съответния клас.

публично статично функция GET ()
статично $ db = нула; // <— вот это
ако ($ db == нула)
$ Db = нов DatabaseConnection ();
върне $ db;
>