Чем Adapter отличается от Facade и Proxy?
Структурные паттерны
Все трое оборачивают объект, но с разной целью: Adapter меняет интерфейс на нужный клиенту, Facade упрощает интерфейс целой подсистемы, Proxy сохраняет интерфейс и контролирует доступ к объекту.
Adapter
Стыкует несовместимое: клиент ждёт pay(rubles), сторонняя библиотека даёт make_payment(cents) — адаптер переводит вызовы. Бывает объектный (через композицию) и классовый (через наследование).
Facade
Один простой метод video_converter.convert(file) прячет оркестрацию пяти классов подсистемы. Цель — снизить связанность клиента с внутренностями, а не совместимость интерфейсов.
Proxy
Заместитель с тем же интерфейсом, что у оригинала:
- virtual — ленивое создание тяжёлого объекта;
- protection — проверка прав доступа;
- remote — сетевые вызовы, RPC-стабы; caching — мемоизация ответов.
Разница одной строкой
Adapter — «интерфейс не подходит», Facade — «интерфейс слишком сложен», Proxy — «нужен контроль на пути к объекту».
Коротко для собеседования
Разница этих обёрток в намерении: Adapter подгоняет чужой интерфейс под ожидаемый, Facade даёт один простой вход в сложную подсистему, Proxy сохраняет интерфейс и встаёт на пути к объекту ради ленивости, прав или кеша. Структурно Proxy близок к Decorator, но управляет доступом, а не добавляет обязанности.