Menu
Coddy logo textTech

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

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

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

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

Категория Назначение Примеры
Creational механизмы создания Object Singleton, Factory, Builder
Structural композиция Class и object Adapter, Decorator, Composite
Behavioral взаимодействие Object и ответственность Observer, Strategy, Command

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

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

challenge icon

Задание

Легко

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

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

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

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

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

    В вашем классификаторе должен быть method 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++