Содержание
Введение
Декоратор
Адаптер
Фасад
Введение
При работе с реальными системами мы знаем, что очень частой проблемой является необходимость интеграции с системами сторонних производителей. Будь то API для интеграции ERP, CRM или вспомогательной системы для удовлетворения потребностей ваших клиентов.
Таким образом, перед нами встает дилемма, как интегрировать наши системы для взаимодействия с другими системами. Нет времени или даже желания постоянно рефакторить систему для общения с партнером.
В этой статье я привожу 3 паттерна проектирования, которые могут стать руководством для решения этой задачи.
Сравнительный
Декоратор: добавляет обязанности к интерфейсу
Адаптер: преобразование одного интерфейса в другой
Фасад: упрощает интерфейс
Декоратор
Декоратор — это структурный шаблон проектирования, который позволяет сопрягать новые модели поведения с объектами, помещая их в объектные обертки, содержащие модели поведения.
Типичные модели поведения, в которых может использоваться этот паттерн, следующие:
- Журнал;
- Cache;Обычная структура декоратора заключается в том, чтобы действовать как обертка для нужного объекта. Пример реализации:
IWeatherService innerService = new WeatherService(apiKey);
IWeatherService withLoggingDecorator = new WeatherServiceLoggingDecorator(innerService, _loggerFactory.CreateLogger<WeatherServiceLoggingDecorator>());
IWeatherService withCachingDecorator = new WeatherServiceCachingDecorator(withLoggingDecorator, _memoryCache);
_weatherService = withCachingDecorator;
В этом коде видно, что innerService обернут декоратором WeatherServiceLoggingDecorator, создающим сервис сLoggingDecorator, который в свою очередь обернут декоратором WeatherServiceCachingDecorator, создающим сервис сCachingDecorator, который является конечным сервисом.
В качестве аналогии часто используется сравнение этой реализации с луковицей и ее слоями.
Адаптер
Адаптер является структурным паттерном проектирования, и его мотивация заключается в преобразовании интерфейса класса в другой интерфейс в соответствии с тем, что ожидает клиент.
Существует два типа адаптеров, которые могут быть реализованы:
- Адаптер объекта — использует композицию, где выполняется реализация интерфейса
- Адаптер класса — использует наследование, при котором происходит наследование внешнего класса
Применимость этого паттерна проектирования заключается в использовании, когда интерфейс сторонней библиотеки или чего-то подобного не совместим с текущим кодом приложения. Он также может применяться в случаях вызовов API, когда необходимо или желательно отделить часть кода, отвечающую за преобразование полученных данных, от той части, где находится бизнес-логика системы. Этот паттерн полезен, когда вы хотите использовать несколько реализаций, где структура похожа, но есть несколько внешних источников (например, различные API). Таким образом, класс Adapter отвечает за всю работу, отделяя этот слой от остальной части системы.
Фасад
Фасад — это структурный паттерн проектирования, который обеспечивает упрощенный интерфейс к библиотеке, фреймворку или любому сложному набору классов.
Пример использования:
- Очень сложный класс, где требуется только несколько его методов, или что для использования другого объекта представлено что-то более интуитивное. Фасадный класс будет выполнять это посредничество, предоставляя только некоторые методы, чтобы упростить реализацию клиентского объекта
- Несколько классов с методами, необходимыми клиентскому объекту. Фасадный класс будет выполнять посредничество, чтобы упростить вызов только одного метода.