Главное отличие
Основная разница между паттернами Adapter и Proxy — в их назначении и подходе к интерфейсам:
- Adapter: Меняет интерфейс объекта так, чтобы он соответствовал тому, что ожидает клиент
- Proxy: Сохраняет тот же интерфейс, но добавляет дополнительные функции или контроль
Изменения интерфейса
Паттерн Adapter
- Преобразует один интерфейс в другой, несовместимый интерфейс
- Позволяет несовместимым компонентам общаться между собой
- Клиент получает изменённый интерфейс, разработанный специально под его нужды
Паттерн Proxy
- Полностью сохраняет оригинальный интерфейс
- Действует как заместитель или суррогат реального объекта
- Добавляет дополнительные возможности без изменения способа доступа к объекту
Аналогия из жизни
Возьми электрические приборы:
-
Пример Adapter: Адаптер питания, который переводит американскую розетку на европейскую. Интерфейс меняется в зависимости от региональных стандартов.
-
Пример Proxy: Сетевой фильтр со встроенной защитой от перепадов напряжения. Штепсель остаётся таким же, как у обычной розетки, но механизмы защиты работают прозрачно где-то внутри.
Основные сценарии использования
Adapter пригодится когда:
- Интегрируешь легаси-системы с современным кодом
- Работаешь со сторонними библиотеками, которые не подходят под твой интерфейс
- Нужно заставить несовместимые интерфейсы работать вместе
Proxy пригодится когда:
- Нужно контролировать доступ к дорогому ресурсу
- Нужно добавить проверки безопасности или валидацию перед операциями
- Нужно реализовать ленивую загрузку или кэширование
- Нужно отслеживать или логировать взаимодействия с объектом
Итого
Выбирай Adapter, когда нужно изменить способ доступа к объекту. Выбирай Proxy, когда нужно контролировать или улучшить то, как работает существующий интерфейс.