Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 70 из 91.
Шаблоны patterns — это проверенные решения распространённых проблем, с которыми разработчики неоднократно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, ты можешь применять эти проверенные шаблоны для решения похожих задач в своём коде.
Представляй шаблоны проектирования как рецепты. Подобно тому как повар следует рецепту, чтобы create блюдо, которое со временем было доведено до совершенства, разработчики используют шаблоны проектирования, чтобы структурировать свой код способами, проверенными и усовершенствованными бесчисленным количеством программистов до них.
Шаблоны проектирования обычно группируются по трём категориям:
| Категория | Назначение | Примеры |
|---|---|---|
| Creational | How objects создаются | Singleton, Factory |
| Structural | How objects составляются | Adapter, Decorator |
| Behavioral | How objects communicate | Observer, Strategy |
На самом деле ты использовал паттерны на протяжении всего курса, даже не осознавая этого. Когда ты создавал абстрактные классы с методами, которые дочерние классы должны реализовать, ты применял одну из форм паттерна Template Method. Когда ты использовал интерфейсы для определения контрактов, ты подготавливал основу для паттерна Strategy.
Изучение шаблонов проектирования даёт вам общий словарь с другими разработчиками. Вместо того чтобы подробно объяснять сложную структуру, вы можете просто сказать: «Я использовал шаблон Factory здесь», — и опытные разработчики сразу поймут ваш подход. В следующих уроках мы реализуем несколько основных шаблонов в PHP.
Задание
ЛегкоДавайте создадим простую систему форматирования сообщений, которая демонстрирует, как шаблоны проектирования помогают организовать код. Вы определите, к какой категории шаблонов относится каждый компонент, и увидите, как разные части системы работают вместе.
Вы организуете код в трёх файлах:
MessageFormatter.php: Create интерфейс с именемMessageFormatter, который определяет контракт для форматирования сообщений. В нём должен быть один методformat(string $message): string. Это представляет категорию behavioral. Он определяет, как objects communicate и обрабатывают данные.Formatters.php: Подключите файл MessageFormatter и Create два класса, реализующих интерфейс:UppercaseFormatter: Its методformat()возвращает message, converted в верхний регистрBracketFormatter: Its методformat()оборачивает message в квадратные скобки, например[message]
main.php: Подключите файл Formatters. Вы получите два input: строку message и тип formatter ("upper"или"bracket").Create функцию с именем
processMessage, которая acceptsMessageFormatterи строку message, а затем возвращает formatted результат. Эта function не должна знать, какой именно formatter она получает. Она просто вызываетformat()у любого переданного object.На основе input типа formatter Create appropriate объект formatter. Передайте его в свою function
processMessageвместе с message и выведите результат.В новой строке выведите, какую category Pattern представляет эта структура. Поскольку мы define взаимозаменяемые behaviors через интерфейс, выведите:
Pattern category: Behavioral
Этот challenge показывает, как интерфейсы позволяют заменять реализации, не изменяя код, который их использует: это основа для таких patterns, как Strategy, которые вы изучите в следующих уроках.
Попробуйте сами
<?php
require_once 'Formatters.php';
// Прочитать ввод
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Создать функцию под названием processMessage, которая принимает MessageFormatter
// и строку сообщения, затем возвращает отформатированный результат
// TODO: На основе $formatterType ("upper" или "bracket"), создать соответствующий форматтер
// TODO: Вызвать processMessage с форматтером и сообщением, затем вывести результат
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP