В чем разница между шаблонами проектирования Фасад, Прокси, Адаптер и Декоратор?
Я никогда не читал четкого объяснения, что твое?
В чем разница между шаблонами проектирования Фасад, Прокси, Адаптер и Декоратор?
Я никогда не читал четкого объяснения, что твое?
Ответы:
Адаптер адаптирует данный класс / объект к новому интерфейсу. В первом случае обычно используется множественное наследование. В последнем случае объект оборачивается соответствующим объектом адаптера и передается вокруг. Здесь мы решаем проблему несовместимых интерфейсов .
Фасад больше похож на простой вход в сложный набор функций. Вы создаете черный ящик, чтобы ваши клиенты меньше беспокоились, т.е. упрощали интерфейсы .
Прокси предоставляет тот же интерфейс, что и класс прокси-сервера, и, как правило, выполняет некоторые вспомогательные функции самостоятельно. (Таким образом, вместо того, чтобы делать несколько копий тяжелого объекта, X
вы делаете копии легкого прокси-сервера, P
который, в свою очередь, управляет X
вашими вызовами и переводит их по мере необходимости.) Вы решаете проблему клиента от необходимости управлять тяжелым и / или сложным объектом .
Декоратор используется, чтобы добавить больше пороха к вашим объектам (обратите внимание на термин объекты - вы обычно украшаете объекты динамически во время выполнения). Вы не скрываете / не ухудшаете существующие интерфейсы объекта, а просто расширяете его во время выполнения .
Теперь, когда у вас есть декоратор, вы, вероятно, захотите узнать, почему акцент на объекте слова - некоторые языки (например, Java) просто не допускают виртуальное наследование (то есть множественное наследование, как в C ++), чтобы вы могли выполнить это в время компиляции.
Поскольку мы перетаскивали несколько наследований (и страшный ромб), вы будете искать миксины - упорядоченные линейные цепочки интерфейсов, чтобы обойти проблемы множественного наследования. Тем не менее, миксины не так хорошо смешиваются. И в итоге мы получаем черты - да, те маленькие капли поведения без состояния, которые вы все время видите в параметрах шаблона в C ++. Черты стараются изящно решать вопросы композиции и декомпозиции поведения, не прибегая ни к множественному наследованию, ни к упорядоченному сцеплению.
Фасад
Например, вы можете использовать фасад для упрощения вызовов API. Взгляните на этот пример удаленного фасада. Идея заключается в том, что полная реализация кода на сервере скрыта от клиента. Клиент вызывает 1 метод API, который, в свою очередь, может сделать 1 или более вызовов API на сервере.
адаптер
Хороший пример этого можно найти здесь , в Википедии. Клиентский объект Source
хотел бы вызвать метод для другого объекта Target
, но интерфейс этого другого объекта отличается от того, что ожидает клиент.
Введите объект адаптера.
Он может принимать вызов от Source
объекта и за кулисами вызывать Target
метод, который следует использовать.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Что касается Прокси, у меня нет никакого опыта в этом шаблоне проектирования.