РЕДАКТИРОВАТЬ:
Это показывает использование DIP в сыром JavaScript и менее полный jQuery пример.Тем не менее, следующее описание может быть легко применено к jQuery.См. Пример jQuery внизу.
Лучший способ - воспользоваться преимуществом «шаблона адаптера» - также называемого «оберткой».
Адаптер - это, по сути, способ упаковкиобъект или модуль таким образом, что он обеспечивает один и тот же согласованный интерфейс своим зависимым .Таким образом, зависимый класс (обычно класс более высокого уровня ) может легко заменять модули одного типа.
Примером этого может быть высокий уровень (или * 1019).* supra ) модуль, который зависит от модулей Geo / Mapping.
Давайте проанализируем это.Если наш вышеупомянутый модуль уже использует GoogleMaps, но тогда руководство решает, что дешевле использовать LeafletMaps - нам не нужно переписывать каждый вызов метода с gMap.showMap(user, latLong)
до leaflet.render(apiSecret,latLong, user)
, и др.Это было бы кошмаром для того, чтобы переносить наше приложение с одной платформы на другую таким образом.
Что мы хотим: нам нужна «оболочка», которая обеспечивает такой же постоянный интерфейс длямодуль выше - и делайте это для каждого модуля нижнего уровня (или инфра модуля).
Вот простой пример:
var infra1 = (function(){
function alertMessage(message){
alert(message);
}
return {
notify: alertMessage
};
})();
var infra2 = (function(){
function logMessage(message){
console.log(message);
}
return {
notify: logMessage
};
})();
var Supra = function(writer){
var notifier = writer;
function writeMessage(msg){
notifier.notify(msg);
}
this.writeNotification = writeMessage;
};
var supra;
supra = new Supra(infra1);
supra.writeNotification('This is a message');
supra = new Supra(infra2);
supra.writeNotification('This is a message');
Обратите внимание, что независимо от того, какой тип низкоуровневого модуля «записи» мы используем (в данном случае infra1
и infra2
), нам не нужно переписывать какую-либо реализацию нашего высокоуровневого модуля,Supra
.Это связано с тем, что DIP использует два различных принципа разработки программного обеспечения: «IoC» (инверсия управления) и «DI» (внедрение зависимостей).
Лучшая аналогия, с которой я столкнулся, - это изображение, показанное ниже..
Каждый электрический источник использует интерфейс , специфичный для типов вещей, которые необходимо подключить к нему.
jQuery Описание:
Этот шаблон может быть легко применен к использованию фреймворков, таких как jQuery.Одним из примеров будет простой дескриптор DOM-Query.Мы можем использовать DIP, чтобы разрешить слабую связь, так что, если мы когда-нибудь решим переключить каркасы или использовать собственные методы DOM-Query, обслуживание будет простым:
var jQ = (function($){
return {
getElement: $
};
})(jQuery);
var nativeModule = (function(){
return {
getElement: document.querySelector
};
})();
var SupraDOMQuery = function(api){
var helper = api, thus = this;
function queryDOM(selector){
el = helper.getElement(selector);
return thus;
}
this.get = queryDOM;
};
var DOM;
DOM = new SupraDOMQuery(jQ);
DOM.get('#id.class');
DOM = new SupraDOMQuery(nativeModule);
DOM.get('#id.class');
Очевидно, что для этого примера потребуются дополнительные функциональные возможностичтобы быть практичным, но я надеюсь, что это понятно.
По сути, различия между Адаптером и Фасадом становятся несколько тривиальными.На Фасаде вы, вероятно, смотрите на один модуль, который оборачивает API или другой модуль;в то время как адаптер создает непротиворечивый API-интерфейс Facade для каждого из своих модулей и использует эту технику, чтобы устранить тесную связь.
Большинство книг JavaScript Design Patterns идут поверх Pattern Adapter;один из них, который более подробно описывает «jQuery Adapter», - это Изучение шаблонов проектирования JavaScript от Addy Osmani , опубликованное O'Reilly - здесь ,Однако я также советую изучить Pro JavaScript Design Patterns от Дастина Диаса и Росса Хармса , опубликованных Apress - , проверить .Тем не менее, я считаю важным понять контекст, в котором мы планируем реализовать DIP по отношению к jQuery.
Надеюсь, это поможет прояснить ситуацию:)