Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 89 из 110.
Паттерны проектирования — это проверенные решения распространенных проблем, с которыми разработчики постоянно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, вы можете применять эти проверенные шаблоны для решения схожих задач согласованным и поддерживаемым способом.
Представьте себе паттерны проектирования как кулинарные рецепты. Подобно тому, как шеф-повар не изобретает новый способ выпечки хлеба каждый раз, программисты используют паттерны, которые оттачивались десятилетиями. Эти паттерны используют концепции ООП, которые вы уже изучили — классы, наследование, интерфейсы и полиморфизм — и комбинируют их определенным образом для решения конкретных задач.
Паттерны проектирования обычно делятся на три категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory |
| Структурные | Как компонуются объекты | Adapter, Decorator |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy |
В следующих уроках вы изучите конкретные паттерны из каждой категории. Каждый паттерн решает определенную проблему: обеспечение существования только одного экземпляра класса, создание объектов без указания конкретных классов или предоставление объектам возможности уведомлять другие объекты об изменениях. Понимание того, когда и почему следует использовать каждый паттерн, так же важно, как и знание того, как его реализовать.
Задание
ЛегкоДавайте создадим простую систему решения задач, которая демонстрирует, как паттерны проектирования организуют код по категориям! Вы создадите структуру, которая классифицирует различные программные задачи и предлагает, какой тип паттерна может помочь в их решении.
Вы организуете свой код в двух файлах:
patterns.dart: Создайте перечисление (enum) с названиемPatternCategoryс тремя значениями:creational,structuralиbehavioral. Каждое значение должно иметь полеString description, объясняющее его назначение:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problem, который представляет программную задачу. Он должен иметь полеString nameи полеPatternCategory category. Включите методsuggest(), который возвращает строку в формате:[name] -> Use a [category description] patternmain.dart: Импортируйте ваш файл с паттернами и продемонстрируйте, как различные задачи соотносятся с разными категориями паттернов. Создайте три экземпляраProblem:- Задача с именем
Ensure single database connectionи категориейcreational - Задача с именем
Make old API work with new systemи категориейstructural - Задача с именем
Notify users when data changesи категориейbehavioral
suggest()для каждой задачи и выведите результаты на печать.- Задача с именем
Этот челлендж поможет вам увидеть, как паттерны проектирования классифицируются по типу задач, которые они решают — это ключевая концепция перед тем, как вы начнете изучать конкретные паттерны в следующих уроках!
Ожидаемый вывод:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternШпаргалка
Паттерны проектирования — это проверенные решения распространенных проблем программирования. Они представляют собой шаблоны, которые определенным образом сочетают концепции ООП (классы, наследование, интерфейсы, полиморфизм).
Паттерны проектирования делятся на три категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Способ создания объектов | Singleton, Factory |
| Структурные | Способ компоновки объектов | Adapter, Decorator |
| Поведенческие | Способ взаимодействия объектов | Observer, Strategy |
Попробуйте сами
import 'patterns.dart';
void main() {
// TODO: Создайте три экземпляра Problem:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: Вызовите suggest() для каждой проблемы и выведите результаты
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий