Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 51 из 70.
Паттерны проектирования — это проверенные решения распространенных проблем, с которыми разработчики постоянно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, паттерны дают нам общий словарь и проверенные подходы к структурированию кода.
Представляйте паттерны проектирования как чертежи. Они не дают вам готовый код для копирования, но описывают, как организовать классы и объекты для решения конкретных задач. Когда кто-то говорит «используй здесь паттерн Factory», опытные разработчики сразу понимают предлагаемую общую структуру.
Паттерны проектирования делятся на три основные категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory |
| Структурные | Как компонуются объекты | Adapter, Decorator |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy |
Паттерны, которые мы рассмотрим, напрямую опираются на уже изученные вами концепции ООП — интерфейсы, наследование, полиморфизм и композицию. Каждый паттерн использует эти основы определенным образом для достижения гибкости, удобства сопровождения или возможности повторного использования.
В следующих уроках вы реализуете несколько основных паттернов, начиная с Singleton, Factory, Observer и Strategy. Понимание этих паттернов поможет вам распознавать распространенные решения в существующих кодовых базах и принимать более обоснованные архитектурные решения в собственных проектах.
Задание
ЛегкоДавайте создадим простую систему каталога паттернов, которая организует информацию о паттернах проектирования в нескольких файлах. Это поможет вам понять, как классифицируются паттерны, одновременно практикуя правильную организацию кода.
Вы создадите три файла для разделения различных зон ответственности:
Pattern.cs: Определите классPatternв пространстве именPatterns, который представляет собой один паттерн проектирования. Каждый паттерн должен иметь свойстваName,Category(Creational, Structural или Behavioral) иDescription. Включите методGetSummary(), который возвращает отформатированную строку:[{Category}] {Name}: {Description}PatternCatalog.cs: Создайте классPatternCatalogв пространстве именPatterns, который управляет коллекцией паттернов. Ваш каталог должен иметь возможность добавлять паттерны и содержать методGetPatternsByCategory(string category), который возвращает список всех паттернов, соответствующих этой категории. Также включите методGetAllSummaries(), который возвращает список строк с описанием всех паттернов в каталоге.Program.cs: Объедините все вместе, создав каталог и заполнив его паттернами на основе входных данных. Затем отобразите паттерны, отфильтрованные по категории.
Вы получите следующие входные данные:
- Количество паттернов для добавления
- Для каждого паттерна: три строки, содержащие название (name), категорию (category) и описание (description)
- Категория для фильтрации
После добавления всех паттернов в каталог выведите сводки паттернов, соответствующих категории фильтра, по одной в строке. Если подходящих паттернов не найдено, выведите No patterns found.
Например, если входные данные следующие:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalВывод должен быть таким:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classЭта задача демонстрирует, как организация связанных классов в отдельные файлы делает вашу кодовую базу чистой и удобной в сопровождении — этот принцип станет еще более важным, когда вы начнете реализовывать реальные паттерны проектирования в следующих уроках!
Шпаргалка
Паттерны проектирования — это проверенные решения распространенных проблем в разработке программного обеспечения. Они представляют собой шаблоны для организации классов и объектов, а не готовый код для копирования.
Паттерны проектирования делятся на три основные категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory |
| Структурные | Как компонуются объекты | Adapter, Decorator |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy |
Паттерны проектирования основываются на концепциях ООП, таких как интерфейсы, наследование, полиморфизм и композиция, для достижения гибкости, поддерживаемости и возможности повторного использования.
Попробуйте сами
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Прочитать количество паттернов
int n = Convert.ToInt32(Console.ReadLine());
// Создать новый PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Прочитать детали каждого паттерна (имя, категория, описание)
// и добавить их в каталог
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Создать Pattern и добавить его в каталог
}
// Прочитать категорию для фильтрации
string filterCategory = Console.ReadLine();
// TODO: Получить паттерны по категории фильтра
// и вывести их краткое описание
// Если паттерны не найдены, вывести "No patterns found"
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов