Menu
CoddyTech

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

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

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

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

Категория Назначение Примеры
Порождающие Механизмы создания объектов Одиночка, Фабрика, Строитель
Структурные Композиция классов и объектов Адаптер, Декоратор, Компоновщик
Поведенческие Взаимодействие объектов и распределение обязанностей Наблюдатель, Стратегия, Команда

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

В 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

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

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

#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

Потренируйтесь самостоятельно: Онлайн-компилятор C++