Убедитесь, что у вас есть два класса с неудобными интерфейсами:
Опишите клиентский интерфейс, через который классы приложения смогли бы использовать сторонний класс.
Создайте класс адаптера, реализовав этот интерфейс.
Поместите в адаптер поле-ссылку на объект-сервис. В большинстве случаев, это поле заполняется объектом, переданным в конструктор адаптера. В случае простой адаптации этот объект можно передавать через параметры методов адаптера.
Реализуйте все методы клиентского интерфейса в адаптере. Адаптер должен делегировать основную работу сервису.
Приложение должно использовать адаптер только через клиентский интерфейс. Это позволит легко изменять и добавлять адаптеры в будущем.
проектируют загодя, чтобы развивать большие части приложения отдельно друг от друга. применяется постфактум, чтобы заставить несовместимые классы работать вместе.
меняет интерфейс существующего объекта. улучшает другой объект без изменения его интерфейса. Причём Декоратор поддерживает рекурсивную вложенность, чего не скажешь об Адаптере.
предоставляет классу альтернативный интерфейс. предоставляет расширенный интерфейс. предоставляет тот же интерфейс.
задаёт новый интерфейс, тогда как повторно использует старый. Адаптер оборачивает только один класс, а Фасад оборачивает целую подсистему. Кроме того, Адаптер позволяет двум существующим интерфейсам работать сообща, вместо того, чтобы задать полностью новый.
, и (а также слегка и ) имеют схожие структуры классов — все они построены на принципе «композиции», то есть делегирования работы другим объектам. Тем не менее, они отличаются тем, что решают разные проблемы. Помните, что паттерны — это не только рецепт построения кода определённым образом, но и описание проблем, которые привели к данному решению.