Javascript. Adapter pattern

Паттерн Адаптер (Adapter pattern) преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент. Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов. Поэтому для использования клиента с несовместимым интерфейсом, необходимо создать адаптер, который выполняет преобразование.Таким образом клиент отделяется от реализованного интерфейса; и если ожидаются изменения интерфейса со временем, то адаптер способен инкапсулировать эти изменения, чтобы клиента не приходилось изменять каждый раз, когда ему потребуется работать с новым интерфейсом. Данный паттерн относится к структурным паттернам.


Ниже представлена диаграмма реализации данного паттерна.


Рассмотрим пример. Допустим мы имеем дело с резиновой уткой MallardDuck с интерфейсом

interface Duck {
  public void quack(); 
  public void fly();


и дикой индюшкой WildTurkey с интерфейсом

interface Turkey {
  public void gooble();
  public void fly();
}

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

/* Target class */

var MallardDuck = function () {

this.quack = function () {
console.log("Quack");
};

this.fly = function () {
console.log("I`m flying");
};
};

/* Adaptee class */

var WildTurkey = function () {

this.gooble = function () {
console.log("Gobble gooble");
};

this.fly = function () {
console.log("I`m flying a short distance");
};
};

/* Adapter class: interface WildTurkey to interface MallardDuck */

var TurkeyAdapter = function (turkey) {

var turkey = turkey;

this.quack = function () {
turkey.gooble();
};

this.fly = function () {
for (var i = 0; i < 5; i++) {
turkey.fly()
}
};
};

/* testing... */

var duck = new MallardDuck();
var turkey = new WildTurkey();
var turkeyAdapter = new TurkeyAdapter(turkey);
turkeyAdapter.quack();
turkeyAdapter.fly(); 

На выходе получаем ожидаемый результат

Gobble gooble
I`m flying a short distance
I`m flying a short distance
I`m flying a short distance
I`m flying a short distance
I`m flying a short distance

Всем удачи!