К примеру у нас есть конструктор объекта Boom с методом bang, вызов которого выводит в консоль свойство todo созданного объекта:
function Boom(todo) { this.todo = todo || 'Boom'; } Boom.prototype.bang = function () { return this.todo + '!'; }; module.exports = Boom;
Импортируем модуль в приложение, создаем объект, вызываем его единственный метод:
var Boom = require('./boom'), boom = new Boom(); console.log(boom.bang());
Для начала предлагаю сразу же применить еще один известный шаблон, который называется шаблоном принудительного использования "new", для того, чтобы создавать объект без оператора "new":
var boom = require('./boom')(); console.log(boom.bang());
Это упростит создание объекта, но немного усложнит исходный код самого объекта:
function Boom(todo) { if (!(this instanceof Boom)) { console.log('Warn: Boom constructor called without "new" operator'); return new Boom(todo); } this.todo = todo || 'Boom'; } Boom.prototype.bang = function () { return this.todo + '!'; }; module.exports = Boom;
Приступаем к "декорированию", смысл которого заключается в том, чтобы предоставить возможность расширения базового функционала объекта - Boom! - в зависимости от определенных условий.
Добавим в конструктор объекта свойство decorators, в котором будем хранить массив "декораторов", которые необходимо применить к объекту. Сами "декораторы" реализуем как свойства конструктора. В методе bang применяем "декораторы" из массива один за другим:
function Boom(todo) { if (!(this instanceof Boom)) { console.log('Warn: Boom constructor called without "new" operator'); return new Boom(todo); } this.todo = todo || 'Boom'; this.decorators = []; } Boom.prototype.decorate = function(decorator) { this.decorators.push(decorator); }; Boom.decorators = {}; Boom.decorators.big = { bang: function (todo) { return ('Big ' + todo).toUpperCase(); } }; Boom.decorators.bada = { bang: function (todo) { return 'Bada ' + todo; } }; Boom.prototype.bang = function () { var todo = this.todo; this.decorators.forEach(function(name) { todo = Boom.decorators[name].bang(todo); }); return todo + '!'; }; module.exports = Boom;
Миксуем "декораторы" в различных сочетаниях:
- Bada Boom:
var boom = require('./boom')(); boom.decorate('bada'); console.log(boom.bang());
- Big Boom:
var boom = require('./boom')(); boom.decorate('big'); console.log(boom.bang());
- и, наконец, Big Bada Boom:
var boom = require('./boom')(); boom.decorate('bada'); boom.decorate('big'); console.log(boom.bang());
Эта реализация шаблона позволяет не только добавлять, но и удалять "декораторы".
Вот и все, пятый элемент обнаружен, мир спасен :).
Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации