Разница между шаблоном адаптера и прокси-сервером?

33

Насколько мы понимаем, шаблон адаптера создает объект-обертку для нашего реального объекта интереса, просто еще один уровень косвенности, который обеспечивает гибкость. гибкость заключается в том, что если интерфейс реального объекта изменяется, то мы меняем интерфейс оболочки, указывающий на реальный объект, оставляя незащищенный интерфейс на стороне клиента неизменным.

Прокси шаблон такой же, с той разницей , что каждый прокси - обертка обеспечивает только когерентное подмножество функций реального объекта. Почему это было бы полезно, если мы стремимся сделать «один класс для одной цели» - это выше моего понимания.

Я правильно понял?

Vorac
источник

Ответы:

55

Не совсем.

Основная цель шаблона адаптера - изменить интерфейс класса / библиотеки A в соответствии с ожиданиями клиента B. Типичная реализация - это класс-оболочка или набор классов. Цель состоит не в том, чтобы облегчить будущие изменения интерфейса, а в текущей несовместимости интерфейса.

Прокси модель также использует обертки классов, но и для различных целей. Целью шаблона прокси является создание замены для реального ресурса. Причины использования прокси могут быть

  • Реальный ресурс находится на удаленном компьютере (прокси-сервер облегчает взаимодействие с удаленным ресурсом)
  • Реальный ресурс дорогой в создании (прокси гарантирует, что стоимость не понесена, если / пока действительно не требуется)

Наиболее важным является то, что прокси-сервер обеспечивает замену реального ресурса, которому он заменяет, поэтому он должен предоставлять тот же интерфейс.

Барт ван Инген Шенау
источник
Прежде всего, спасибо за отличный ответ. Реализует ли прокси все интерфейсы, которые нужны текущему клиенту, или все интерфейсы, которые предоставляет реальный ресурс?
Vorac
1
@Vorac: это зависит от сложности интерфейса и вашей философии дизайна. Оба варианта возможны, но если интерфейс большой / сложный или вы сильно верите в YAGNI, то имеет смысл реализовывать только то, что вам нужно.
Барт ван Инген Шенау
Итак, учитывая, что шаблон Adapter использует классы-оболочки, является ли шаблон Adapter прокси-шаблоном?
moonman239
@ moonman239: Нет, потому что намерение использовать класс-оболочку другое. Тот факт, что два шаблона выглядят одинаково на диаграмме классов, не означает, что они связаны или реализуют друг друга. Основным фактором, по которому шаблоны будут отличаться, является их намерение.
Барт ван Инген Шенау