JSFiddle - React, Tailwind, and code Playground
HTML
<!--Пример паттерна Mediator/Dispatcher-->
<a href="http://blog.makushev.com/2015/08/29/facade-javascript-oop-pattern/" target="_blank">Описание паттерна Facade</a>
JavaScript
//Производитель
var Apple = {
buy: function (model) {
return this._create(model);
},
_create: function (model) {
//сложный процесс производства модели
return model;
}
};
//Склад
var Stock = {
_stock: [],
//добавление на склад
add: function (product) {
this._stock.push(product);
},
//получение со склада
get: function (product) {
var self = this,
stockProduct;
this._stock.forEach(function (item, index) {
if (item === product) {
stockProduct = self._stock.splice(index, 1);
}
});
return stockProduct ? stockProduct[0] : null;
}
};
//Магазин
var Shop = {
//фасад магазина - интерфейс для покупки
buy: function (product) {
return this._getFromStock(product);
},
//внутрений метод магазина по получению продукта
_getFromStock: function (product) {
var stockProduct;
stockProduct = Stock.get(product);
//если есть на складе - отдаем
if (stockProduct) {
return stockProduct;
}
//если нет на складе - покупаем у производителя и кладем на склад
Stock.add(Apple.buy(product));
//отдаем со склада
return Stock.get(product);
}
};
//Добавим на склад несколько моделей
Stock.add('iPhone 3g');
Stock.add('iPhone 4');
Stock.add('iPhone 4s');
Stock.add('iPhone 5s');
//Купим модель, которая есть на складе
console.log(Shop.buy('iPhone 3g'));
//Купим модель, которой нет на складе
console.log(Shop.buy('iPhone 6'));