Можешь рассказать о различных структурных паттернах в объектно-ориентированном проектировании?
Ответ от нейросети
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, работе с файловыми системами и сложными доменными моделями.