Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 70 из 91.
Паттерны проектирования — это проверенные решения распространенных проблем, с которыми разработчики постоянно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, вы можете применять эти проверенные шаблоны для решения аналогичных задач в своем собственном коде.
Представьте себе паттерны проектирования как кулинарные рецепты. Подобно тому, как шеф-повар следует рецепту для создания блюда, доведенного до совершенства со временем, разработчики используют паттерны проектирования для структурирования своего кода способами, которые были протестированы и усовершенствованы бесчисленным количеством программистов до них.
Паттерны проектирования обычно группируются в три категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory |
| Структурные | Как объекты компонуются | Adapter, Decorator |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy |
На самом деле вы использовали паттерны на протяжении всего этого курса, даже не осознавая этого. Когда вы создавали абстрактные классы с методами, которые должны реализовывать дочерние классы, вы применяли одну из форм паттерна Template Method. Когда вы использовали интерфейсы для определения контрактов, вы подготавливали почву для паттерна Strategy.
Изучение паттернов проектирования дает вам общий язык с другими разработчиками. Вместо того чтобы подробно объяснять сложную структуру, вы можете просто сказать: «Я использовал здесь паттерн Factory», и опытные разработчики сразу поймут ваш подход. В следующих уроках мы реализуем несколько основных паттернов на PHP.
Задание
ЛегкоДавайте создадим простую систему форматирования сообщений, которая демонстрирует, как паттерны проектирования помогают организовать код. Вы определите, к какой категории паттернов относится каждый компонент, и увидите, как различные части системы работают вместе.
Вы организуете свой код в трех файлах:
MessageFormatter.php— Создайте интерфейс с именемMessageFormatter, который определяет контракт для форматирования сообщений. Он должен иметь один методformat(string $message): string. Это представляет категорию behavioral (поведенческие) — она определяет, как объекты взаимодействуют и обрабатывают данные.Formatters.php— Подключите файл MessageFormatter и создайте два класса, реализующих этот интерфейс:UppercaseFormatter— его методformat()возвращает сообщение, преобразованное в верхний регистр.BracketFormatter— его методformat()заключает сообщение в квадратные скобки, например[message].
main.php— Подключите файл Formatters. Вы получите два входных значения: строку сообщения и тип форматировщика ("upper"или"bracket").Создайте функцию с именем
processMessage, которая принимаетMessageFormatterи строку сообщения, а затем возвращает отформатированный результат. Этой функции не нужно знать, какой именно форматировщик она получает — она просто вызываетformat()для любого переданного объекта.На основе входного типа форматировщика создайте соответствующий объект форматировщика. Передайте его в функцию
processMessageвместе с сообщением и выведите результат.На новой строке выведите, какую категорию паттернов представляет эта структура. Поскольку мы определяем взаимозаменяемое поведение через интерфейс, выведите:
Pattern category: Behavioral
Этот челлендж показывает, как интерфейсы позволяют менять реализации, не изменяя код, который их использует — это основа для таких паттернов, как Стратегия (Strategy), которые вы изучите в следующих уроках.
Шпаргалка
Паттерны проектирования — это проверенные решения распространенных проблем программирования, которые предоставляют шаблоны для эффективного структурирования кода.
Паттерны проектирования делятся на три категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory |
| Структурные | Как компонуются объекты | Adapter, Decorator |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy |
Паттерны проектирования обеспечивают общий словарь для разработчиков, упрощая обсуждение сложных архитектурных решений.
Попробуйте сами
<?php
require_once 'Formatters.php';
// Чтение входных данных
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Создайте функцию с именем processMessage, которая принимает MessageFormatter
// и строку сообщения, а затем возвращает отформатированный результат
// TODO: На основе $formatterType ("upper" или "bracket") создайте соответствующий форматировщик
// TODO: Вызовите processMessage с форматировщиком и сообщением, затем выведите результат
// TODO: Выведите категорию паттерна на новой строке
// Формат: "Pattern category: Behavioral"
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy