представлять
Декораторы предлагают более гибкие альтернативы, чем наследование. Декораторы используют объекты, используемые для обертывания того же интерфейса, что не только позволяет добавлять поведение в методы, но и устанавливать методы на исходные вызовы объектов (например, конструктор декоратора).
Декораторы используются для добавления новых функций с помощью формы перегруженных методов. Этот режим может добавить свое собственное поведение до или после декоратора для достижения определенной цели.
текст
Так каковы преимущества режима декоратора? Как упоминалось ранее, декоратор является альтернативой достижению наследования. Когда сценарий работает, добавление поведения к подклассу влияет на все экземпляры оригинального класса, а декоратор - нет. Вместо этого он может добавить новое поведение в разные объекты. Следующий код выглядит так:
Кода -копия выглядит следующим образом:
// класс (функция), которая требует украшения (функция)
функция macBook () {
this.cost = function () {
вернуть 1000;
};
}
Функциональная память (MacBook) {
this.cost = function () {
вернуть macBook.cost () + 75;
};
}
Функция Bluraydrive (MacBook) {
this.cost = function () {
вернуть macBook.cost () + 300;
};
}
Функциональное страхование (MacBook) {
this.cost = function () {
вернуть macBook.cost () + 250;
};
}
// Использование
var mymacbook = новая страховка (новая Bluraydrive (New Memory (New MacBook ())));
console.log (mymacbook.cost ());
Ниже приведен еще один пример. Когда мы называем PerformTask на объекте Decorator, он не только имеет некоторое поведение декоратора, но и называет функцию PerformTask нижнего объекта.
Кода -копия выглядит следующим образом:
function conceteClass () {
this.performtask = function () {
this.pretask ();
console.log («что -то делать»);
this.posttask ();
};
}
Функция AbstractDecorator (украшен) {
this.performtask = function () {
decorted.performtask ();
};
}
функция ConcretedEcoratorClass (украшен) {
this.base = AbstractDecorator;
This.base (украшен);
decorated.pretask = function () {
console.log ('pre-calling ..');
};
decorated.posttask = function () {
console.log ('пост-золлинг ..');
};
}
var concrete = new ConceteClass ();
var decorator1 = новый ConcretedeCoratorClass (бетон);
var decorator2 = новый ConcretedeCoratorClass (Decorator1);
Decorator2.performtask ();
Давайте возьмем еще один тщательный пример:
Кода -копия выглядит следующим образом:
var tree = {};
tree.decorate = function () {
console.log ('убедитесь, что дерево выиграло/' t Fall ');
};
tree.getDecorator = function (deco) {
Дерево [deco] .prototype = this;
вернуть новое дерево [deco];
};
tree.redballs = function () {
this.decorate = function () {
this.redballs.prototype.decorate (); // Шаг 7: Сначала выполнить прототип (это ангел).
console.log ('надеть на красные шарики); // Шаг 8 Вывод красный
// Используйте эти 2 шага в качестве метода украшения Redballs
}
};
tree.blueballs = function () {
this.decorate = function () {
this.blueballs.prototype.decorate (); // Шаг 1: Сначала выполнить метод украшения прототипа, то есть wee.decorate ()
console.log ('добавить синие шарики); // Шаг 2 Вывод синий
// Используйте эти 2 шага в качестве метода голубыхболов.
}
};
tree.angel = function () {
this.decorate = function () {
this.angel.prototype.decorate (); // Шаг 4: Сначала выполнить прототип (это голубые шарики).
console.log ('ангел на вершине'); // Шаг 5 выходной ангел
// Используйте эти 2 шага в качестве метода украшения Ангела
}
};
Tree = tree.getDecorator ('Blueballs'); // Шаг 3: Назначьте объект Blueballs Tree, а GetDecorator в родительском прототипе все еще доступен
Tree = Tree.getDecorator ('Angel'); // Шаг 6: Назначьте объект ангела на дерево. В настоящее время getDecorator в родительском прототипе родительского прототипа все еще доступен
Tree = tree.getDecorator ('redballs'); // Шаг 9: назначьте объект Redballs на дерево
Tree.decorate (); // Шаг 10: Выполните метод украшения объекта Redballs
Суммировать
Узор декоратора - это способ динамически добавить больше функций к существующим функциям. Каждая функция, которая будет украшена, помещается в отдельную функцию, а затем используйте эту функцию, чтобы обернуть существующий объект функции, который будет украшен. Поэтому, когда необходимо выполнить специальное поведение, вызовный код может выборочно и последовательно использовать функцию декорирования для обертывания объекта по мере необходимости. Преимущество заключается в том, что он отличает основные обязанности класса (функции) от декоративной функции.