В чем разница паттернов Bridge и Proxy
Что проверяют
Различаете ли вы паттерны по намерению, а не по диаграмме: оба строятся на композиции и снаружи похожи. Следом обычно просят отличить Proxy от Decorator и привести пример из iOS, а не из учебника с фигурами.
Как отвечать
Сформулируйте разницу одной фразой: Bridge разделяет две оси изменений, Proxy стоит перед одним объектом и управляет доступом к нему.
- Bridge: абстракция держит ссылку на протокол реализации, и обе иерархии растут независимо. На три вида плеера и три движка воспроизведения без моста нужно девять классов, с мостом шесть. Пример:
MediaPlayerс подклассами для видео и аудио хранитPlaybackEngine, а за протоколом стоит реализация наAVPlayerили сторонний движок. Мост закладывают при проектировании, когда обе оси видны заранее; - Proxy: реализует тот же протокол, что и настоящий объект, поэтому клиент подмены не замечает. Разновидности: виртуальный (ленивая загрузка тяжёлого ресурса), защитный (проверка прав), кэширующий, удалённый, логирующий. Прокси часто сам создаёт объект и управляет его жизнью.
Пример из iOS: NSProxy в Foundation, корневой класс для объектов, которые перенаправляют сообщения. На нём строят weak proxy, чтобы CADisplayLink или Timer не удерживали контроллер сильной ссылкой. В Swift кэширующий прокси обычно выглядит как класс, реализующий тот же протокол ImageLoading, что и сетевой загрузчик, и заглядывающий в NSCache перед запросом.
Если спросят про Decorator: структура почти как у Proxy, но декоратор добавляет поведение, декораторы складываются в цепочку, и собирает её клиент. Прокси нужен для контроля доступа, и обычно он один.
Где спотыкаются
Путают Bridge с Adapter. Adapter задним числом подгоняет чужой готовый интерфейс под нужный, а Bridge проектируют заранее, чтобы две иерархии не перемножались.
Говорят, что у прокси «свой интерфейс». Если клиенту приходится знать, что перед ним прокси, это уже фасад или обёртка.
Приводят только абстрактный пример с фигурами и цветами. На iOS-собеседовании ответ сильнее, когда вы называете реальный случай из проекта: сеть, кэш картинок, плееры.