Применимость и шаги реализации Adapter
Применимость паттерна
В случае когда ты хочешь использовать сторонний класс, интерфейс которого не соответствует остальному коду приложения, адаптер поможет решить проблему.
Этот паттерн позволяет создать объект-прокладку, который будет превращать вызовы приложения в формат, понятный стороннему классу.
Адаптер применим и в том случае, когда тебе нужно использовать несколько существующих подклассов, в которых не хватает какой-то общей функциональности, причём расширить суперкласс ты не можешь.
Можно было бы создать ещё один уровень подклассо в и добавить в них недостающую функциональность. Но при этом пришлось бы продублировать один и тот же код в обеих ветках подклассов.
Более элегантным решением было бы поместить недостающую функциональность в адаптер и приспособить его к работе с суперклассом. Такой адаптер сможет работать со всеми подклассами иерархии. Это решение будет сильно напоминать паттерн декоратор.
Шаги реализации паттерна
- Убедись, что у тебя есть два класса с несовместимыми интерфейсами:
- полезный сервис — служебный класс, который ты не можешь изменять (он либо сторонний, либо от него зависит другой код);
- один или несколько клиентов — существующих классов приложения, несовместимых с сервисом из-за неудобного или несовпадающего интерфейса.
- Опиши клиентский интерфейс, через который классы приложения смогли бы использовать класс сервиса.
- Создай класс адаптера, реализовав этот интерфейс.
- Помести в адаптер поле, которое будет хранить ссылку на объект сервиса. Обычно это поле заполняют объектом, переданным в конструктор адаптера. В случае простой адаптации этот объект можно передавать через параметры методов адаптера.
- Реализуй все методы клиентского интерфейса в адаптере. Адаптер должен делегировать основную работу сервису.
- Приложение должно использовать адаптер только через клиентский интерфейс. Это позволит легко изменять и добавлять адаптеры в будущем.
Преимущества и недостатки паттерна
+ Отделяет и скрывает от клиента подробности преобразования различных интерфейсов.
- Усложняет код программы из-за введения дополнительных классов.