определение
Режим адаптера (адаптер) состоит в том, чтобы преобразовать интерфейс (метод или атрибут) класса (объект) в другой интерфейс (метод или атрибут), который хочет клиент. Режим адаптера позволяет эти классы (объекты), которые изначально не могли работать вместе из -за несовместимости интерфейса. Быстрая обертка.
Псевдоним для адаптера - это обертка, которая является относительно простым рисунком. Есть много таких сценариев в разработке программ: когда мы пытаемся вызвать интерфейс модуля или объекта, мы обнаруживаем, что формат этого интерфейса не соответствует текущим требованиям. В настоящее время есть два решения. Первое - это изменить оригинальную реализацию интерфейса, но если исходный модуль очень сложный, или модуль, который мы получаем, является сжатым кодом, написанным кем -то другим, изменение исходного интерфейса будет нереальной. Второй метод состоит в том, чтобы создать адаптер и преобразовать исходный интерфейс в другой интерфейс, который хочет клиент. Клиент должен иметь дело только с адаптером.
Зачем вам использовать режим адаптера?
При разработке приложения вам часто нужно заменить его часть, например, библиотеку, которую вы используете для хранения журналов или аналогичного контента. Когда вы замените его новой библиотекой, маловероятно, что новая библиотека имеет точно такой же интерфейс. Отсюда у вас есть два варианта:
(1) Проверьте весь код и измените весь код, указывающий на старую библиотеку.
(2) Создайте адаптер, чтобы новая библиотека могла использовать тот же интерфейс, что и старая библиотека.
Очевидно, что в некоторых случаях, если ваше приложение мало, или есть несколько ссылок на старую библиотеку, более целесообразно проверить полный код и изменить его в соответствии с новой библиотекой вместо добавления нового уровня абстракции, чтобы усложнить код. Однако в большинстве случаев создание адаптера является более практичным и экономичным времени.
Примеры кода JavaScript
Когда что -то может случиться, это определенно произойдет. Сначала давайте посмотрим на этот маленький LoggerFactory, который позволяет нам модифицировать интерфейс журнала, который мы используем легче.
var loggerfactory = {getLogger: function () {return window.console; }, ...};/* Пример использования*/var logger = loggerfactory.getlogger (); logger.log ("что -то для log");Когда мы называем GetLogger, это возвращает нам объект консоли (консоль). Для этого упражнения мы притворяемся, что консольный объект имеет только один метод - журнал, и он может получать только один параметр типа строки. Затем у нас есть еще один интерфейс журнала, который будет более сложным, потому что 1) он реализован в JavaScript, в отличие от консоли, которая не является самим браузером; 2) Он отправит журналы на сервер через AJAX, что также означает, что мы должны кодировать данные URL -адреса (код не будет специально реализовать вопросы, связанные с кодированием URL, потому что это не имеет ничего общего с шаблоном адаптера, о котором мы хотим поговорить). Конечно, он будет использовать другой интерфейс из консоли.
var ajaxlogger = {sendlog: function () {var data = this.urlencode (аргументы); jquery.ajax ({url: "http://example.com/log", data: data}); }, urlencode: function (arg) {... return oncodedData; }, ...};Мы использовали запросы jQuery Ajax, в основном, чтобы сэкономить время и игнорировать вещи, которые мы не хотим делать с режимом адаптера. Теперь мы должны сделать адаптер и изменить предыдущий LoggerFactory, чтобы вернуть этот адаптер вместо консольного объекта.
var ajaxloggeradapter = {log: function (arg) {ajaxlogger.sendlog (arg); }};/ * Регулировать loggerFactory */var loggerFactory = {getLogger: function () {// Изменение возвращаемого значения return ajaxloggerAdapter; }, ...};Мы внесли только одну линию изменений в существующем коде, и вся программа может использовать этот новый интерфейс журнала.
Сложный адаптер
Интерфейс журнала является очень простым примером. У него есть только один метод, и не сложно отобразить его непосредственно со старым методом. В большинстве случаев это не так. Вы можете столкнуться с проблемой, что параметры этих отображенных функций совершенно разные, и старый интерфейс может не иметь этих параметров вообще, и вам придется иметь дело с ними сами. В некоторых случаях вы должны удалить некоторые параметры, потому что новые интерфейсы не используют их вообще. Если отображение интерфейса между двумя объектами слишком сложно, мы должны думать о других способах, в любом случае, я не хочу найти и изменять тысячи строк старого кода.