Рубрики
Без рубрики

JavaScript Decorator Pattern

Демонстрируя рисунок декоратора в JavaScript с использованием прототипов наследования и нормальных функций.

Автор оригинала: Faizan Haider.

При разработке большого приложения наша главная цель – не повторять себя и повторно использовать наш код. Для повторного использования кода мы можем сделать много вещей, но один из них наследство. Пример наследования с использованием JavaScript:

function Sandwich(name) {
   this.name = name;
}

Sandwich.prototype.eat = function () {
   console.log("I'm eating " + this.name);
}

function Subway () {
   Sandwich.call(this, 'subway');
}

Subway.prototype = Object.create(Sandwich.prototype);
Subway.prototype.cost = function () {
   return 5;
}

Это простая реализация, но многие из нас хотят разных вещей с нашими бутербродами. Некоторые как соленья, кетчуп, в то время как другие любят горчицу и гуакамоле, а некоторые из нас хотят всех них. И нам нужно получить стоимость бутерброда после добавления наших любимых. Но когда мы делаем это, используя наследство, нам понадобятся несколько типов данных на Сэндвич Отказ Нам понадобится Вспомогательный, с помощью, с помощью, умастар, с пикчлеанадмустартом, с Pickleandketch И многие другие при добавлении новых приправа. Все они имеют одинаковую функциональность, но крошечную разницу между ними. Теперь нам нужно думать, что наша реализация и декораторы учатся.

Декоратор

В основном это обертка, которая расширяет функциональность объекта при сохранении интерфейса объекта. Например, нам нужны разные расходы для разных размеров. Поскольку декораторы являются только оберткой, мы можем обернуть новый объект в Funciton, как это:

Subway.sixInch = function (subwayObj) { //Method on Subway function object
  var cost = subwayObj.cost(); //Get current cost of sandwich
    subwayObj.cost = function () { //We aren't changing interface but providing more functionality
    	return cost - 1;
    }
}    
 
Subway.footLong = function (subwayObj) {}; //Default is Foot Long 
Subway.partySub = function (subwayObj) { 
  var cost = subwayObj.cost(); 
    subwayObj.cost = function () { 
    	return cost + 3;
    }
}

Subway.partySub = function (subwayObj) { 
  var cost = subwayObj.cost(); 
    subwayObj.cost = function () { 
    	return cost + 3;
    }
}

Subway.pickle = function (subwayObj) { 
  var cost = subwayObj.cost(); 
    subwayObj.cost = function () { 
    	return cost + 0.12;
    }
}

Subway.mustard = function (subwayObj) { 
  var cost = subwayObj.cost(); 
    subwayObj.cost = function () { 
    	return cost + 0.25;
    }
}

Subway.ketchup = function (subwayObj) { 
  var cost = subwayObj.cost(); 
    subwayObj.cost = function () { 
    	return cost + 0.10;
    }
}

И теперь, когда мы хотим, чтобы вечеринка сабкурировала и горчицу, нам нужно только назвать эти методы декоратора на нашем новом объекте.

var mySandwich = new Subway(); // current cost of sandwich 5
Subway.partySub(mySandwich); // add 3 and cost would be 8
Subway.pickle(mySandwich); // add 0.12 and cost would be 8.12
Subway.mustard(mySandwich); // add 0.25 and cost would be 8.37
console.log(mySandwich.cost());//8.37

Мы все это сделали без добавления ни одного типа данных на объект метро для всей этой различной комбинации. Мы можем изменить этот код, чтобы использовать наследство и прототип.

function Sandwich() {
  this._cost = 0;
}

Sandwich.prototype.cost = function () {
  return this._cost;
}

function SandwichDecorator(sandwich) {
  Sandwich.call(this);
    this.sandwich = sandwich;
}
SandwichDecorator.prototype = Object.create(Sandwich.prototype);
SandwichDecorator.prototype.cost = function () {
  return this._cost + this.sandwich.cost();
}

function Pickle(sandwich) {
  SandwichDecorator.call(this, sandwich);
    this._cost = 0.12;
}
Pickle.prototype = Object.create(SandwichDecorator.prototype);

function Subway() {
  Sandwich.call(this);
    this._cost = 5;
}
Subway.prototype = Object.create(Sandwich.prototype);


var mySandwich = new Subway();
mySandwich = new Pickle(mySandwich);
console.log(mySandwich.cost()); //5.12

В новом примере прототипа нам не нужно создавать функцию стоимости снова и снова. Я надеюсь, что вы нашли это полезно.