Какие знаешь паттерны поведения?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерны поведения (Behavioral Patterns)
Паттерны поведения — это шаблоны проектирования, которые решают задачи эффективного взаимодействия объектов и распределения ответственности между ними. Они фокусируются не на создании объектов или структурах, а на коммуникации между ними, управлении алгоритмами и потоками данных.
Я знаю и регулярно применяю на практике следующие ключевые паттерны поведения:
1. Стратегия (Strategy)
Позволяет определять семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми. Позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
public interface ISortStrategy
{
void Sort(List<int> data);
}
public class QuickSortStrategy : ISortStrategy
{
public void Sort(List<int> data) => data.Sort(); // Быстрая сортировка
}
public class Context
{
private ISortStrategy _strategy;
public void SetStrategy(ISortStrategy strategy) => _strategy = strategy;
public void ExecuteSort(List<int> data) => _strategy?.Sort(data);
}
2. Наблюдатель (Observer)
Определяет отношение «один-ко-многим» между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически. Широко используется в event-driven архитектуре.
public interface IObserver
{
void Update(string message);
}
public class Subject
{
private List<IObserver> _observers = new();
public void Subscribe(IObserver observer) => _observers.Add(observer);
public void Notify(string message) => _observers.ForEach(o => o.Update(message));
}
3. Команда (Command)
Инкапсулирует запрос в виде объекта, позволяя параметризовать клиенты с различными запросами, ставить запросы в очередь или логировать их, а также поддерживать отмену операций.
public interface ICommand
{
void Execute();
void Undo();
}
public class AddUserCommand : ICommand
{
private readonly UserService _service;
private readonly User _user;
public AddUserCommand(UserService service, User user) => (_service, _user) = (service, user);
public void Execute() => _service.Add(_user);
public void Undo() => _service.Remove(_user);
}
4. Цепочка обязанностей (Chain of Responsibility)
Позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам или передать его дальше по цепочке.
5. Шаблонный метод (Template Method)
Определяет скелет алгоритма в базовом классе, позволяя подклассам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
6. Итератор (Iterator)
Предоставляет способ последовательного доступа к элементам составного объекта без раскрытия его внутреннего представления. В C# реализован через интерфейсы IEnumerable и IEnumerator.
7. Посредник (Mediator)
Управляет взаимодействием множества объектов, уменьшая связанность между ними, заставляя их общаться через централизованный объект-посредник.
8. Снимок (Memento)
Позволяет сохранять и восстанавливать предыдущее состояние объекта, не раскрывая деталей его реализации. Полезен для реализации механизма отмены операций.
9. Состояние (State)
Позволяет объекту изменять свое поведение при изменении внутреннего состояния. Создается впечатление, что объект изменил свой класс.
public interface IState
{
void Handle(Context context);
}
public class Context
{
private IState _state;
public void SetState(IState state) => _state = state;
public void Request() => _state?.Handle(this);
}
10. Посетитель (Visitor)
Позволяет добавлять новые операции к объектам без изменения их классов. Полезен при работе со сложными структурами объектов (например, деревьями AST в компиляторах).
11. Интерпретатор (Interpreter)
Определяет представление грамматики языка и интерпретатор для предложений этого языка. Используется реже, в основном для обработки специализированных языков или выражений.
Практическое применение в C#
В C# Backend разработке эти паттерны особенно важны:
- Стратегия и Шаблонный метод — для реализации различных бизнес-процессов
- Наблюдатель — основа событийной модели .NET (
events,IObservable) - Команда и Снимок — для реализации CQRS, отмены действий и очередей задач
- Цепочка обязанностей — в middleware ASP.NET Core (
UseMiddleware) - Посредник — для уменьшения связанности между модулями системы
- Состояние — для управления жизненным циклом объектов (заказы, документы)
Правильный выбор паттерна зависит от конкретной задачи: Стратегия меняет поведение объекта "извне", а Состояние — "изнутри"; Наблюдатель реализует push-модель уведомлений, а **Итератор" — pull-модель доступа к данным.
Глубокое понимание паттернов поведения позволяет создавать гибкие, поддерживаемые и масштабируемые системы, где объекты слабо связаны, а добавление новой функциональности не требует переписывания существующего кода.