Sobes.tech
Назад к вопросам
Junior — Middle
60

Можешь рассказать о различных структурных паттернах в объектно-ориентированном проектировании?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Структурные паттерны отвечают за то, как правильно собирать объекты и классы в более крупные структуры. Обычно ожидают понимание, что они упрощают взаимодействие между сущностями, не меняя их исходный код. Для собеседования важно уметь назвать основные паттерны, объяснить их назначение и привести типичный пример применения.

Определение:

Структурные паттерны — это шаблоны проектирования, которые помогают гибко объединять объекты и классы в более сложные структуры. Они решают задачи расширения функциональности, унификации несовместимых интерфейсов и упрощения работы с составными объектами. В C# к ним обычно относят Adapter, Decorator, Facade, Composite, Proxy, Bridge и Flyweight.

Пример использования:

Допустим, есть система, которая умеет работать только с интерфейсом IPaymentGateway, а интегрировать нужно сторонний сервис с другим API. Для этого подходит Adapter: он приводит внешний интерфейс к нужному внутреннему виду.

public interface IPaymentGateway
{
    void Pay(decimal amount);
}

public class ExternalPaymentService
{
    public void MakePayment(int cents)
    {
        Console.WriteLine($"Оплата {cents} центов через внешний сервис");
    }
}

public class PaymentAdapter : IPaymentGateway
{
    private readonly ExternalPaymentService _service;

    public PaymentAdapter(ExternalPaymentService service)
    {
        _service = service;
    }

    public void Pay(decimal amount)
    {
        _service.MakePayment((int)(amount * 100));
    }
}

public class Program
{
    public static void Main()
    {
        IPaymentGateway gateway = new PaymentAdapter(new ExternalPaymentService());
        gateway.Pay(12.50m);
    }
}

Пояснение кода:

Здесь IPaymentGateway — ожидаемый интерфейс системы. ExternalPaymentService — внешний класс, который нельзя или неудобно менять. PaymentAdapter реализует нужный интерфейс и внутри преобразует вызов Pay в вызов MakePayment, переводя сумму из долларов в центы. В результате основная система работает со знакомым контрактом, не зная деталей внешнего API.

Если говорить о других структурных паттернах кратко:

  • Decorator добавляет объекту поведение динамически, не меняя его класс.
  • Facade дает упрощенный интерфейс к сложной подсистеме.
  • Composite позволяет работать одинаково с отдельным объектом и их деревом.
  • Proxy подставляет заместителя и контролирует доступ к объекту.
  • Bridge разделяет абстракцию и реализацию, чтобы менять их независимо.
  • Flyweight экономит память за счет разделения общих данных между множеством объектов.

Ключевые моменты:

  • Структурные паттерны помогают собирать объекты в более удобные и гибкие конструкции.
  • Их цель — снизить связанность и упростить расширение системы без переписывания существующего кода.
  • Для собеседования особенно важно различать назначение Adapter, Decorator, Facade и Composite.
  • Adapter решает проблему несовместимых интерфейсов, Decorator — добавления поведения, Facade — упрощения API, Composite — работы с деревом объектов.
  • В C# эти паттерны часто используются при интеграции с внешними сервисами, построении UI, работе с файловыми системами и сложными доменными моделями.