Menu
Coddy logo textTech

Введение в паттерны проектирования

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 90 из 104.

Паттерны проектирования — это проверенные, многократно используемые решения распространенных проблем, возникающих при проектировании программного обеспечения. Это не тот код, который вы копируете напрямую — это шаблоны или чертежи, описывающие, как структурировать классы и объекты для элегантного решения конкретных задач.

Концепция была популяризирована «Бандой четырех» (GoF) в их книге 1994 года, в которой были каталогизированы 23 фундаментальных паттерна. Эти паттерны обычно группируются в три категории:

Категория Цель Примеры
Порождающие Механизмы создания объектов Singleton, Factory, Builder
Структурные Композиция классов и объектов Adapter, Decorator, Composite
Поведенческие Взаимодействие и распределение обязанностей между объектами Observer, Strategy, Command

Зачем изучать паттерны проектирования? Они обеспечивают общий язык общения между разработчиками — фраза «используй здесь Factory» мгновенно передает сложную идею. Они также помогают избежать повторного изобретения решений и делают ваш код более гибким и удобным в сопровождении.

В C++ паттерны проектирования используют возможности ООП, которые вы уже изучили: наследование, полиморфизм, абстрактные классы и шаблоны. В следующих уроках вы реализуете несколько основных паттернов и поймете, когда каждый из них является подходящим инструментом для решения задачи.

challenge icon

Задание

Легко

Давайте создадим простой классификатор паттернов, который продемонстрирует ваше понимание трех категорий паттернов проектирования. Вы создадите систему, которая принимает название паттерна и определяет, к какой категории он относится — Creational, Structural или Behavioral — вместе с кратким описанием назначения этой категории.

Вы организуете свой код в трех файлах:

  • PatternCategory.h: Определите абстрактный базовый класс с именем PatternCategory, который представляет категорию паттернов проектирования. Он должен иметь:
    • Чисто виртуальный метод getName(), который возвращает название категории в виде строки
    • Чисто виртуальный метод getPurpose(), который возвращает описание того, что делают паттерны в этой категории
    • Виртуальный деструктор

    Затем создайте три производных класса, наследуемых от PatternCategory:

    • CreationalCategory — возвращает имя "Creational" и назначение "Object creation mechanisms"
    • StructuralCategory — возвращает имя "Structural" и назначение "Class and object composition"
    • BehavioralCategory — возвращает имя "Behavioral" и назначение "Object interaction and responsibility"
  • PatternClassifier.h: Создайте класс PatternClassifier, который может определить, к какой категории относится данный паттерн.

    Ваш классификатор должен иметь метод classify, который принимает название паттерна (строку) и возвращает указатель на соответствующую PatternCategory. Используйте умные указатели (std::unique_ptr) для управления памятью.

    Классификатор должен распознавать следующие паттерны:

    • Creational: Singleton, Factory, Builder
    • Structural: Adapter, Decorator, Composite
    • Behavioral: Observer, Strategy, Command

    Если название паттерна не распознано, верните nullptr.

  • main.cpp: Считайте один входной параметр — название паттерна проектирования.

    Создайте PatternClassifier и используйте его для классификации входного паттерна. Если паттерн распознан, выведите:

    [PatternName] is a [CategoryName] pattern
    Purpose: [CategoryPurpose]

    Если паттерн не распознан, выведите:

    Unknown pattern: [PatternName]

Например, при вводе Singleton:

Singleton is a Creational pattern
Purpose: Object creation mechanisms

При вводе Observer:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

При вводе Proxy:

Unknown pattern: Proxy

Эта задача закрепляет знания о трех категориях паттернов проектирования, одновременно практикуя наследование, полиморфизм и умные указатели — концепции, которые вы уже освоили. Многофайловая структура отражает то, как в реальных проектах организуются связанные классы.

Шпаргалка

Паттерны проектирования — это многократно используемые решения распространенных проблем проектирования программного обеспечения. Они служат шаблонами для структурирования классов и объектов, а не готовым кодом для копирования.

Паттерны проектирования делятся на три основные категории:

Категория Назначение Примеры
Порождающие Механизмы создания объектов Singleton, Factory, Builder
Структурные Композиция классов и объектов Adapter, Decorator, Composite
Поведенческие Взаимодействие и распределение обязанностей между объектами Observer, Strategy, Command

Преимущества паттернов проектирования:

  • Обеспечивают общий словарь терминов для разработчиков
  • Позволяют избежать «изобретения велосипеда» при решении типовых задач
  • Делают код более гибким и удобным в сопровождении

В C++ паттерны проектирования используют возможности ООП, включая наследование, полиморфизм, абстрактные классы и шаблоны.

Попробуйте сами

#include <iostream>
#include <string>
#include "PatternClassifier.h"

int main() {
    // Считать название паттерна
    std::string patternName;
    std::cin >> patternName;
    
    // TODO: Создать экземпляр PatternClassifier
    
    // TODO: Использовать классификатор для классификации входного паттерна
    
    // TODO: Если паттерн распознан, вывести:
    // "[PatternName] is a [CategoryName] pattern"
    // "Purpose: [CategoryPurpose]"
    
    // TODO: Если паттерн не распознан (nullptr), вывести:
    // "Unknown pattern: [PatternName]"
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

13Паттерны проектирования. Часть 1

Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy