Найти тему
ModernCode

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

Паттерн проектирования - это решение определенной задачи при проектировании архитектуры программы.

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

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

Можно заниматься разработкой, не зная паттернов. Возможно, Вы уже не раз реализовали какой-то из паттернов, даже не догадываясь об этом. Но осознанное владение отличает профессионала от любителя. Зачем же знать паттерны?

  1. Решения, проверенные годами. При использовании готовых решений временные затраты значительно уменьшаются.
  2. Стандартизированный код. При использовании типовых решений, меньше ошибок в архитектуре программы, так как все проблемы уже давно найдены.
  3. Сленг программистов. По названию паттерна другие разработчики быстрее поймут ваш код, и им не нужно будет объяснять, какие модули за что отвечают.

Классификация паттернов.

Паттерны отличаются между собой по уровню сложности, детализации и размеру проектируемой системы.

Простые — идиомы. Они не универсальны, так как применяются только в рамках одного языка программирования.

Универсальные — архитектурные паттерны. Их можно реализовать практически на любом языке. Они нужны для проектирования всей архитектуры вцелом.

Также паттерны отличаются назначением:

  • Порождающие паттерны - гибкое создание объектов и отсутствие необходимости внесения лишних зависимостей. Отвечают за удобное и безопасное создание объектов.
  • Структурные паттерны - различные варианты определения связей между объектами. Отвечают за построение удобной иерархии классов.
  • Поведенческие паттерны - коммуникация между объектами. Отвечают за решение задач, связанных с эффективным и безопасным взаимодействием объектов программы.

К порождающим паттернам относятся:

  • Фабричный метод (Factory Method) - определяет единый интерфейс для создания объектов в суперклассе, при этом позволяет подклассам изменять их тип.
  • Абстрактная фабрика (Abstract Factory)- предоставляет возможность создавать группы связанных объектов, не привязываясь к конкретным классам.
  • Строитель (Builder) - создает сложные объекты итеративно. Также дает возможность использовать один и тот же код для получения разных представлений объектов.
  • Прототип (Prototype)- копирует объекты, не вдаваясь в подробности их реализации.
  • Одиночка (Singleton)- гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

К структурным паттернам относятся:

  • Адаптер (Adapter)- позволяет объектам с несовместимыми интерфейсами работать вместе.
  • Мост (Bridge)- разделяет классы на две отдельные иерархии - абстракцию и реализацию, позволяя изменять их независимо друг от друга.
  • Компоновщик (Composite) - группирует множество объектов в древовидную структуру, а затем работает с ней, как с единичным объектом.
  • Декоратор (Decorator) - позволяет динамически добавлять объектам новую функциональность, используя “обёртки”.
  • Фасад (Facade)- предоставляет интерфейс системе классов, библиотеке или фреймворку.
  • Легковес/Приспособленец (Flyweight)- позволяет вместить большее количество объектов в выделенную память. Экономит её, разделяя общее состояние, вместо хранения одинаковых данных в каждом объекте.
  • Заместитель (Proxy) - подставляет вместо реальных специальные объекты-заменители. Они перехватывают вызовы к оригиналу, позволяя сделать что-то до или после передачи вызова.

К поведенческим паттернам относятся:

  • Цепочка обязанностей (Chain of Responsibility)- передает запросы последовательно по цепочке обработчиков. Каждый последующий решает, может ли он обработать запрос сам и стоит ли передать запрос дальше.
  • Команда (Command)- преобразует запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать, а также поддерживать отмену операций.
  • Итератор (Iterator)- последовательно обходит элементы составных объектов, не раскрывая их внутреннего представления.
  • Посредник (Mediator)- уменьшает связность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.
  • Снимок (Memento)- сохраняет и восстанавливает прошлые состояния объектов, не раскрывая подробностей их реализации.
  • Наблюдатель (Observer)- создает механизм подписки, позволяющий одним объектам следить за событиями, происходящими в других объектах, и реагировать на них.
  • Состояние (State)- изменяет поведение объектов в зависимости от своего состояния.
  • Стратегия (Strategy)- определяет группу схожих алгоритмов и помещает каждый в собственный класс, после чего их можно взаимозаменять прямо во время выполнения программы.
  • Шаблонный метод (Template Method)- определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Позволяет им переопределять шаги алгоритма, не меняя его общей структуры.
  • Посетитель (Visitor)- добавляет в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.

В следующих статьях мы поговорим о конкретных паттернах проектирования и будем рассматривать их реализацию.