← Назад к вопросам

Какие знаешь поведенческие паттерны проектирования?

1.8 Middle🔥 142 комментариев
#ООП и паттерны проектирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поведенческие паттерны проектирования в C#

Поведенческие паттерны — это категория паттернов проектирования, которые решают задачи эффективного взаимодействия объектов и распределения ответственности между ними. Они фокусируются на алгоритмах и распределении обязанностей между объектами, описывая не только структуру объектов, но и схемы их коммуникации. В контексте C# и backend-разработки они особенно важны для создания гибких, поддерживаемых и расширяемых систем.

Ключевые поведенческие паттерны

1. Стратегия (Strategy)

Паттерн Стратегия позволяет определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми. Это позволяет изменять алгоритм независимо от клиента, который его использует.

public interface ISortingStrategy
{
    void Sort(List<int> data);
}

public class QuickSortStrategy : ISortingStrategy
{
    public void Sort(List<int> data) => data.Sort(); // Быстрая сортировка
}

public class BubbleSortStrategy : ISortingStrategy
{
    public void Sort(List<int> data) {
        // Реализация пузырьковой сортировки
        for (int i = 0; i < data.Count; i++)
            for (int j = 0; j < data.Count - 1; j++)
                if (data[j] > data[j + 1])
                    (data[j], data[j + 1]) = (data[j + 1], data[j]);
    }
}

public class DataProcessor
{
    private ISortingStrategy _strategy;
    
    public DataProcessor(ISortingStrategy strategy) => _strategy = strategy;
    
    public void ProcessData(List<int> data) => _strategy.Sort(data);
}

В backend-разработке Стратегия часто используется для выбора алгоритмов обработки данных, методов валидации или бизнес-логики, например, при реализации различных способов расчета стоимости заказа или применения скидок.

2. Наблюдатель (Observer)

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

public interface IObserver
{
    void Update(string message);
}

public class Subject
{
    private List<IObserver> _observers = new();
    
    public void AddObserver(IObserver observer) => _observers.Add(observer);
    
    public void NotifyObservers(string message)
    {
        foreach (var observer in _observers)
            observer.Update(message);
    }
}

В C# этот паттерн часто реализуется через события (event и EventHandler). В backend-приложениях он используется для:

  • Отправки уведомлений при изменениях состояния (например, при обновлении заказа).
  • Реализации механизма Event-Driven Architecture.
  • Логирования и аудита изменений данных.

3. Команда (Command)

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

public interface ICommand
{
    void Execute();
    void Undo();
}

public class CreateUserCommand : ICommand
{
    private UserService _service;
    private User _user;
    
    public CreateUserCommand(UserService service, User user)
    {
        _service = service;
        _user = user;
    }
    
    public void Execute() => _service.Create(_user);
    public void Undo() => _service.Delete(_user.Id);
}

В backend-разработке Команда применяется для:

  • Реализации CQRS (Command Query Responsibility Separation).
  • Построения систем с возможностью отката операций.
  • Обработки транзакционных бизнес-операций.

4. Шаблонный метод (Template Method)

Шаблонный метод определяет скелет алгоритма в базовом классе, позволяя подклассам переопределять определенные шаги алгоритма без изменения его структуры.

public abstract class DataProcessorTemplate
{
    public void ProcessData()
    {
        LoadData();
        TransformData();
        SaveData();
    }
    
    protected abstract void LoadData();
    protected abstract void TransformData();
    protected virtual void SaveData() => Console.WriteLine("Data saved.");
}

Этот паттерн широко используется в backend для создания:

  • Базовых обработчиков HTTP-запросов с общими этапами (валидация, авторизация, логирование).
  • Алгоритмов обработки данных с изменяемыми шагами (например, импорт данных из различных источников).

5. Посредник (Mediator)

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

public interface IMediator
{
    void Notify(object sender, string event);
}

public class OrderMediator : IMediator
{
    private InventoryService _inventory;
    private PaymentService _payment;
    private NotificationService _notification;
    
    public void Notify(object sender, string event)
    {
        if (event == "OrderCreated")
        {
            _inventory.ReserveItems();
            _payment.ProcessPayment();
            _notification.SendOrderConfirmation();
        }
    }
}

В сложных backend-системах Посредник помогает:

  • Управлять взаимодействием между модулями бизнес-логики.
  • Реализовывать централизованное управление业务流程.
  • Упрощать тестирование и модификацию взаимодействий компонентов.

Другие важные поведенческие паттерны

  • Цепочка обязанностей (Chain of Responsibility) — позволяет передавать запрос по цепочке обработчиков. Часто используется в middleware ASP.NET Core для обработки HTTP-запросов.
  • Состояние (State) — позволяет объекту изменять поведение при изменении внутреннего состояния. Применяется для реализации сложных объектов с изменяемым поведением (например, заказ с состояниями "Новый", "Оплачен", "Отгружен").
  • Итератор (Iterator) — предоставляет способ последовательного доступа к элементам агрегата без раскрытия его внутренней структуры. В C# реализован через интерфейсы IEnumerator и IEnumerable.

Практическое применение в backend-разработке

В разработке C# backend-приложений поведенческие паттерны решают критически важные задачи:

  • Управление бизнес-логикой: паттерны Стратегия и Шаблонный метод позволяют создавать гибкие и расширяемые бизнес-правила.
  • Обработка запросов: Цепочка обязанностей и Команда фундаментальны для построения middleware и обработчиков запросов.
  • Связь между компонентами: Наблюдатель и Посредник обеспечивают эффективную коммуникацию между модулями системы без создания жестких зависимостей.
  • Управление состоянием: паттерн Состояние помогает корректно моделировать сложные объекты с жизненным циклом.

Выбор конкретного паттерна зависит от контекста задачи: Стратегия идеальна для замены алгоритмов, Наблюдатель — для событийных систем, Команда — для транзакционных операций. В современных C# приложениях эти паттерны часто сочетаются с принципами Dependency Injection и используются в рамках архитектурных подходов, таких как Domain-Driven Design и Microservices.