Паттерны проектирования на PHP
Порождающие паттерны
Абстрактная фабрика
Abstract Factory
Позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
Строитель
Builder
Позволяет создавать сложные объекты пошагово. Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов.
Фабричный метод
Factory Method
Определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
Прототип
Prototype
Позволяет копировать объекты, не вдаваясь в подробности их реализации.
Одиночка
Singleton
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Структурные паттерны
Адаптер
Adapter
Позволяет объектам с несовместимыми интерфейсами работать вместе.
Мост
Bridge
Разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
Компоновщик
Composite
Позволяет сгруппировать объекты в древовидную структуру, а затем работать с ними так, как будто это единичный объект.
Декоратор
Decorator
Позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
Фасад
Facade
Предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
Легковес
Flyweight
Позволяет вместить бóльшее количество объектов в отведённую оперативную память. Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в каждом объекте.
Заместитель
Proxy
Позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.
Поведенческие паттерны
Цепочка обязанностей
Chain of Responsibility
Позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи.
Команда
Command
Превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
Итератор
Iterator
Даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.
Посредник
Mediator
Позволяет уменьшить связанность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.
Снимок
Memento
Позволяет делать снимки состояния объектов, не раскрывая подробностей их реализации. Затем снимки можно использовать, чтобы восстановить прошлое состояние объектов.
Наблюдатель
Observer
Создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
Состояние
State
Позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
Стратегия
Strategy
Определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
Шаблонный метод
Template Method
Определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
Посетитель
Visitor
Позволяет создавать новые операции, не меняя классы объектов, над которыми эти операции могут выполняться.
Войти Связаться
Главная страница — Паттерны проектировния на PHP
Теория и применение шаблонов проеткирования в рамках Объектно-Ориентированного стиля программирования на языке PHP
Здравствуй, апологет объектно-ориентированного программирования!На этом сайте ты познакомишься с описанием, объяснением и примерами реализации паттернов проектирования на языке программирования PHP!
Что такое паттерны проектирования?
Любопытный факт: впервые набор шаблонов проектирования был представлен архитектором Кристофером Александром в книге «A Pattern Language: Towns, Buildings, Construction», однако в области архитектуры его идея не прижилась.
Первое же упоминания этого явления в сфере программирования — замечательная книга
Как следует из название книги — в ней авторы собрали и описали наиболее часто встречающиеся задачи, обернули их в типовое решение с помощью ООП, а так же дали им имя.
Если вы раньше писали код на ООП и не пытались знакомиться с паттернами, то в процессе изучение вы нередко будете думать:
— О, так у «этого» еще и название есть!
Шаблоны делятся на Порождающие (Creational), Структурные (Structural) и Поведенческие (Behavioural).
Шаблоны полезны тем, что позволяют решать типовые задачи в проеткировании, котороые были, есть и будут. Они «вылизаны» поколениями программистов и при грамотном их применении позволяют решить задачу наиболее гибким и безопасным способом (и еще кучей «образов»).
Шаблоны — это такой «абстрактный фреймворк» с готовыми «идеями».
При этом пользоваться шаблонами необходимо с умом (как и всем в этом мире), так как при оголтелом стремлении применять шаблоны везде и всюду — очень легко можно применить шаблон там, где это неуместно, тем самым испортив код. С осторожностью нужно применять шаблоны при коммуникации с коллегами, так как ряд шаблонов, особенно поведенческих на мой взгляд, имеют довольно сложное и не всегда однозначное представление. Поэтому прежде чем писать в комментарии «тут был применен шаблон Медиатор», убедитесь что он действительно «Медиатор» и ваши представления с коллегой о шаблоне совпадают!
На этом сайте, на момент публикации, представлены авторские реализации и описания к 23 шаблонам проектирования, почти полностью совпадающие с шаблонами описанными GoF в первой книге.
Обратите внимание! Большая часть представленных мною классов может вам показаться черезчур пустой и нефункциональной,
а реализации измененного и добавленного конкретным шаблоном функционала чаще всего минимальны и ограничены изменением
выводимой в браузер строки.
Шаблонов, на самом деле, несколько больше, чем представлено на сайте (например, мною полностью были проигнорированы «Фундаментальные» паттерны). В перспективе, постараюсь добавить их и сюда!
Вся информация, представленная на сайте — авторское понимание предмета. Кому-то объяснение и примеры могут показаться дилетансткими (вероятно такими они и являются).
Шаблоны проектирования в PHP
Шаблоны создания
Абстрактная фабрика
Позволяет создавать семейства связанных объектов без указания их конкретных классов.
Builder
Позволяет шаг за шагом создавать сложные объекты. Шаблон позволяет создавать различные типы и представления объекта, используя один и тот же код построения.
Фабричный метод
Предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.
Prototype
Позволяет копировать существующие объекты, не делая ваш код зависимым от их классов.
Singleton
Позволяет гарантировать, что класс имеет только один экземпляр, предоставляя при этом глобальную точку доступа к этому экземпляру.
Структурные образцы
Адаптер
Позволяет объектам с несовместимыми интерфейсами взаимодействовать.
Мост
Позволяет разделить большой класс или набор тесно связанных классов на две отдельные иерархии — абстракцию и реализацию, — которые можно разрабатывать независимо друг от друга.
Составной
Позволяет объединять объекты в древовидные структуры, а затем работать с этими структурами, как если бы они были отдельными объектами.
Decorator
Позволяет прикреплять новые поведения к объектам, помещая эти объекты в специальные объекты-оболочки, которые содержат поведения.
Facade
Предоставляет упрощенный интерфейс для библиотеки, платформы или любого другого сложного набора классов.
Приспособленец
Позволяет разместить больше объектов в доступном объеме ОЗУ, разделяя общие части состояния между несколькими объектами вместо хранения всех данных в каждом объекте.
Прокси
Позволяет указать замену или заполнитель для другого объекта. Прокси контролирует доступ к исходному объекту, позволяя вам выполнять какие-либо действия либо до, либо после того, как запрос дойдет до исходного объекта.
Шаблоны поведения
Цепочка ответственности
Позволяет передавать запросы по цепочке обработчиков. При получении запроса каждый обработчик решает либо обработать запрос, либо передать его следующему обработчику в цепочке.
Команда
Превращает запрос в автономный объект, содержащий всю информацию о запросе. Это преобразование позволяет передавать запросы в качестве аргументов метода, откладывать выполнение запроса или ставить его в очередь, а также поддерживать операции, которые нельзя отменить.
Итератор
Позволяет просматривать элементы коллекции, не раскрывая ее базовое представление (список, стек, дерево и т. д.).
Медиатор
Позволяет уменьшить хаотические зависимости между объектами. Шаблон ограничивает прямую связь между объектами и заставляет их взаимодействовать только через объект-посредник.
Memento
Позволяет сохранять и восстанавливать предыдущее состояние объекта, не раскрывая деталей его реализации.
Наблюдатель
Позволяет определить механизм подписки для уведомления нескольких объектов о любых событиях, происходящих с объектом, за которым они наблюдают.
Состояние
Позволяет объекту изменять свое поведение при изменении его внутреннего состояния. Создается впечатление, что объект изменил свой класс.
Стратегия
Позволяет определить семейство алгоритмов, поместить каждый из них в отдельный класс и сделать их объекты взаимозаменяемыми.
Шаблонный метод
Определяет скелет алгоритма в суперклассе, но позволяет подклассам переопределять определенные шаги алгоритма без изменения его структуры.
Посетитель
Позволяет отделить алгоритмы от объектов, с которыми они работают.
Войти Связаться с нами
Что такое шаблоны проектирования в PHP? Учитесь на реальных примерах кода
Содержание
Статья представляет собой обзор шаблонов проектирования в PHP, их важности, типов, истории и критики. Вот несколько коротких фрагментов из статьи.
Основные моменты статьи
- Шаблон проектирования — это универсальное решение повторяющихся проблем проектирования.
- Главными характеристиками хорошего проекта являются масштабируемость, ремонтопригодность и эффективность.
- Программная система может правильно выполнять намеченные функции независимо от дизайна.
- Хороший дизайн способствует масштабируемости, гибкости и простоте обслуживания.
- Существует три типа шаблонов проектирования: творческий, структурный и поведенческий.
- Банда четырех (GoF) представила шаблоны проектирования в своей книге.
Вот несколько кратких фактов, но мы рекомендуем вам прочитать статью полностью, чтобы понять ее полностью.
Содержание
- Что такое шаблон проектирования
- Что делает дизайн программного обеспечения хорошим
- Использование шаблонов проектирования в PHP
- Зачем использовать шаблоны проектирования
- Типы шаблонов проектирования
- критика шаблонов проектирования
- История шаблонов проектирования
- книг по шаблонам проектирования
Что такое шаблон проектирования?
Компьютерное программирование — это больше, чем просто изучение синтаксиса.
Значительное внимание компьютерного программирования уделяется решению задач. Языки, фреймворки, библиотеки и другие инструменты помогают решать проблемы.
Хотя формулировки проблем могут различаться, обычно существует повторяющийся шаблон во многих проблемах, которые кажутся совершенно разными. Например, все вложенные структуры данных могут иметь рекурсивные шаблоны. Если вы эффективно применяете рекурсию, вы сможете решить практически любую проблему, связанную с такими структурами данных.
Один из эффективных способов решения проблем – выявление повторяющихся шаблонов. Вот в чем заключается идея шаблонов проектирования.
«Шаблон проектирования — это универсальное решение повторяющихся проблем проектирования».
Шаблоны проектирования не являются алгоритмами.
Паттерны не являются ни алгоритмами, ни компьютерными программами. Они также не являются жесткими и быстрыми правилами программирования. Вы можете не применять шаблон проектирования, и ваша программа все равно будет работать. Запуск компьютерной программы — это одно, а разработка эффективного и масштабируемого решения — совсем другое.
Шаблоны проектирования созданы опытными людьми, которые сталкивались с проблемами проектирования, часто возникающими при разработке объектно-ориентированного программного обеспечения. Таким образом, эти шаблоны являются своего рода наблюдениями и опытом, общими шаблонами и проектными решениями, которые вы можете повторно использовать в правильных сценариях для разработки более качественных программных систем.
Но что такое хороший дизайн в разработке программного обеспечения?
Хорошо спроектированное программное обеспечение имеет ряд основных характеристик, отличающих его от плохого. Главными характеристиками хорошего дизайна являются масштабируемость, ремонтопригодность и эффективность. Хотя есть и другие важные функции, которые должно выполнять программное обеспечение, но с точки зрения дизайна, это три лучших игрока.
Шаблоны проектирования — это средство для достижения цели, то есть они помогают нам разрабатывать масштабируемые, эффективные и удобные в сопровождении системы. Некоторые фундаментальные идеи модульности, разделения и программирования интерфейсов жизненно важны для хорошего дизайна. Таким образом, шаблоны опираются на эти основы и помогают нам определить правильные сценарии для разработки лучших решений.
Хороший дизайн против плохого дизайна
Хватит теории. Давайте рассмотрим программу, которая использует стороннюю службу электронной почты для отправки электронных писем. На изображении ниже сравниваются два дизайна программного обеспечения. Оба они выполняют функциональность электронной почты. Так в чем же тогда подвох? Вы можете понять это?
Плохой
Что ж, компоненты подключены правильно. Клиентская программа вызывает службу электронной почты и делегирует ей функции отправки электронной почты. Это правильно, не так ли? Но подумайте немного о том, что произойдет, если.
- Вам необходимо переключиться на новую службу электронной почты.
- Вам необходимо использовать несколько служб и динамически переключаться.
Вот некоторые изменения, которые, скорее всего, произойдут. Новая служба электронной почты может сильно отличаться от той, которую вы используете. Теперь, если ваша клиентская программа тесно связана с реализацией службы электронной почты, вы должны внести много изменений в клиентский код.
Нет ничего необычного в том, чтобы что-то сломать и внести ошибки при попытке внести изменения. Эта проблема обостряется, если ее разработал кто-то другой, и теперь вы застряли со всеми проблемами и ошибками. Проблема может быть огромной, если многие другие компоненты полагаются на службу электронной почты. Этот дизайн, несомненно, является кошмаром для обслуживания.
Кроме того, этот дизайн нарушает принцип открытого-закрытого, который является одним из фундаментальных принципов проектирования и гласит, что «Программное обеспечение должно быть открытым для расширения, но закрытым для модификации».
Итак, как улучшить этот дизайн и создать более масштабируемое программное обеспечение?
Хороший
Так что там с ‘
Какая польза от этой абстракции? Другие модули не тесно связаны с базовой службой электронной почты. Программное обеспечение является гибким, расширяемым и ремонтопригодным. Нужно изменить службу электронной почты? Реализуйте этот интерфейс в новом сервисе, и остальной код будет работать нормально. Вам не нужно вносить какие-либо изменения в существующий код.
Нужно добавить более одной службы электронной почты? Реализуйте этот интерфейс в других службах, и вы сможете динамически переключать их во время выполнения. Короче говоря, ваши модули видят только интерфейс, и им все равно, что такое почтовые службы и как они работают.
Многие почтовые сервисыВ отличие от этой конструкции, плохая конструкция имела тесно связанные модули. Код клиента сильно зависел от службы электронной почты. Таким образом, любое изменение службы электронной почты имело цепную реакцию на остальную часть программы.
Шаблоны проектирования на помощь
Мы видели хороший дизайн и плохой дизайн. Забавный факт заключается в том, что независимо от дизайна обе программы могут выполнять пользовательские функции по отправке электронных писем. Недостатки становятся более очевидными в долгосрочной перспективе, когда начинают поступать запросы на изменение и планируются мероприятия по обслуживанию. Плохой дизайн может стать проблемой в этот момент.
Шаблоны проектирования спешат на помощьУ разработчиков часто возникает соблазн разработать решение без учета факторов, которые могут негативно повлиять на дизайн и архитектуру. В разработке программного обеспечения изменение — единственная константа. Поэтому, если ваше программное обеспечение негибкое и устойчиво к изменениям, оно будет стоить вам много времени, усилий и денег.
Итак, в следующий раз задайте себе эти вопросы, даже если ваше программное обеспечение пройдет проверку на работоспособность.
Шаблоны проектирования — это общие шаблоны и наблюдения. Они не привязаны к языку программирования. Однако вы можете применять их на любом языке программирования по вашему выбору. В следующих статьях мы узнаем, как использовать шаблоны проектирования в PHP. За этой вводной статьей в PHP последуют другие статьи о шаблонах проектирования, ориентированные на сценарии.
Зачем использовать шаблоны проектирования
Хотя о полезности шаблонов проектирования уже многое известно, ниже приведены некоторые важные выводы.
- Улучшает архитектуру программного обеспечения, используя проверенные парадигмы проектирования.
- Ускоряет процесс разработки за счет использования шаблонов для повторяющихся проблем.
- Улучшает читаемость и стандартизацию кода.
- Неявно использует передовой опыт и принципы проектирования.
- Помогает в обмене знаниями и обработке документации.
- Это делает программную систему более масштабируемой и удобной в сопровождении.
Типы шаблонов проектирования
Шаблоны проектирования можно разделить на следующие категории.
- Креативные шаблоны проектирования
- Шаблоны структурного проектирования
- Шаблоны поведенческого проектирования.
Каждый из них имеет множество шаблонов проектирования. Давайте сделаем краткий обзор.
Креативные шаблоны проектирования
Как следует из названия, порождающие шаблоны проектирования связаны с созданием экземпляров класса. Мы знакомы с новое ключевое слово для создания объектов класса. Хотя это может быть очевидным способом создания экземпляра класса, он не всегда самый гибкий.
Шаблон создания использует объектно-ориентированные парадигмы для делегирования инстанцирования.
- Abstract Factory
Использует абстракцию для создания экземпляров семейств подклассов.
- Builder
Вызывает метод для пошагового построения сложного объекта.
- Фабричный метод
Использует абстракцию для создания экземпляров подклассов.
- Пул объектов
Повторно использует объекты из существующего пула.
- Прототип
Клонирует существующий объект.
- Singleton
Создает один глобальный объект.
Шаблоны структурного проектирования
Шаблоны структурного проектирования помогают создавать сложные отношения между объектами и классами для получения новых функций.
- Адаптер
Адаптация одного интерфейса к другому. - Мост
Использует абстракцию для разделения абстрактных и конкретных классов.
- Составной
Создает древовидную структуру для определения иерархий.
- Декоратор
Использует классы декораторов для добавления функций на лету.
- Приспособленец
Использует общие состояния для эффективного использования памяти.
- Фасад
Класс удобства для сложных подсистем.
- Прокси
Использует объект для представления другого.
- Данные закрытого класса
Создает класс для ограничения раскрытия данных.
Шаблоны поведенческого проектирования
Шаблоны поведенческого проектирования связаны с общением между объектами.
- Команда
Инкапсулирует команды как объекты.
- Цепочка ответственности
Регулирует поток данных в системе.
- Итератор
Определяет класс для итерации различных просматриваемых структур данных.
- Интерпретатор
Предоставляет класс интерпретатора для работы с выражениями в программе.
- Память
Запоминает прежнее состояние объекта для целей восстановления.
- Посредник
Использует класс-посредник для упрощенного взаимодействия объектов.
- Наблюдатель
Использует механизм уведомления об изменениях.
- Стратегия
Инкапсулирует алгоритмы в конкретный класс.
- Состояние
Изменяет поведение объекта при изменении состояния.
- Template Method
Определяет шаблон алгоритмов и функций для реализации подклассами.
- Посетитель
Определяет новые операции без изменения существующих классов.
История шаблонов проектирования
Паттерны — обычное явление во многих других сферах жизни. Архитектор Кристофер Александер первым сформулировал концепцию использования шаблонов в архитектуре зданий и инфраструктуры.
Эта идея стала популярной в разработке программного обеспечения, потому что проектирование или проектирование программного обеспечения похоже на проектирование физической структуры. Было предпринято много попыток определить различные принципы и шаблоны проектирования.
Банда четырех (GoF)
Эрих Гамма, Джон Влиссидес, Ральф Джонсон и Ричард Хелм — четыре автора, широко известные как «Банда четырех» (GoF). В 1994 году они опубликовали «Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения», в котором представили идею шаблонов проектирования в объектно-ориентированном программном обеспечении.
Они включили около 23 паттернов в свою книгу и стали популярными в кругах разработчиков. Та же книга GoF вдохновила нас на шаблоны, которые мы включили в эту статью.
Критика шаблонов проектирования
Обвинение языков программирования
Некоторые разработчики считают, что шаблоны проектирования применимы в языках с низкой абстракцией, например — C или C++. Языки высокого уровня и современные языки могут не нуждаться в каком-либо шаблоне, потому что они поставляются с абстракциями из коробки. Итак, большинство экспертов считают, что это неотъемлемая проблема языков программирования.
Чрезмерное использование шаблонов
Некоторые разработчики критикуют шаблоны проектирования за излишнее усложнение кода. В то же время это спорно, потому что шаблоны не должны использоваться слишком часто. Это лучшие практики, а не жесткие правила. Разработчики склонны использовать шаблоны без необходимости, что в большинстве случаев снижает читабельность и эффективность.
Нет официальных оснований
Как и любая другая инженерная отрасль, разработка программного обеспечения в высшей степени рациональна и алгоритмична. Он опирается на стандартизацию и фиксированный набор правил. Таким образом, многие люди винят, что у GoF не было формальных оснований для публикации их работы, и они были за более общие принципы, которые не были подкреплены никакими исследованиями.
Книги по шаблонам проектирования
Хотите узнать больше о шаблонах проектирования? Есть много отличных ресурсов в Интернете. Мы рекомендуем следующие книги для вашей коллекции, так как они могут научить вас теории и применению шаблонов проектирования в повседневном программировании. Не стесняйтесь использовать следующие партнерские ссылки Amazon, если вы хотите их приобрести и поддержать наши усилия.
Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспеченияЭто книга, с которой все началось. Я считаю, что каждый программист в какой-то момент своей карьеры должен иметь ссылку на эту книгу. За прошедшие годы было много обновлений и отличного нового контента, но это классика. Он до сих пор выдерживает испытание временем и так же актуален для сегодняшнего дня, как и в оригинальном издании 90-х годов.
Проверьте это на Amazon
Изучение шаблонов проектирования PHPЭто отличная книга, чтобы выйти за рамки теории и применить ее для написания хорошего PHP-кода. Learning PHP Design Patterns издается популярной медиа-компанией O’Reilly. O’Reilly постоянно публикует некоторые из наиболее полезных справочных материалов, связанных с разработкой программного обеспечения. Известно, что они предоставляют материалы, которые подробно освещают тему в простой для понимания форме. Я рекомендую эту книгу каждому PHP-разработчику.
Проверьте на Amazon
Хотите увидеть наш полный обзор книг по шаблонам проектирования? Прочтите нашу огромную обзорную статью о более чем 15 книгах по шаблонам проектирования.
Что такое шаблоны проектирования в PHP?
Шаблоны проектирования в PHP — это просто набор повторений, обнаруженных в хорошо написанном коде, который был применен к этому языку. Вы не должны чувствовать себя обязанными сопоставлять эти шаблоны. Вместо этого они являются хорошими руководствами и справочниками при написании кода для решения деловых и технических задач.
Путь обучения объектно-ориентированному программированию на PHP
Эта статья является частью нашей серии статей по изучению объектно-ориентированного программирования с помощью PHP. В нем представлены некоторые концепции, передовой опыт и стратегии, которые помогут вам повысить уровень своих навыков. Это отличный старт для того, чтобы стать успешным программистом.
- Объектно-ориентированное программирование на PHP
- PHP-классы
- Абстрактные классы PHP
- PHP-интерфейсы
- Шаблоны проектирования
Шаблоны проектирования в PHP Learning Series.
Эта статья является частью нашей серии шаблонов проектирования в PHP. Мы рассмотрим все шаблоны и покажем, как они могут помочь вам создавать более качественные приложения.