представлять
Композит объединяет объекты в структуру дерева, чтобы представлять «частичную» иерархию. Комбинированный режим делает пользователей в соответствии с использованием отдельных объектов и комбинированных объектов.
Общие сценарии включают механизм управления в ASP.NET (то есть контроль может содержать контроль дочернего управления, который может рекурсивно работать, добавлять и удалять контроль дочерних), и аналогично, существует механизм DOM. Узел DOM может содержать дочерние узлы. Будь то родительский узел или узел дочернего узела, он имеет общие функции добавления, удаления и прохождения дочерних узлов. Следовательно, ключом к комбинированному шаблону является получение абстрактного класса, который может представлять как детские элементы, так и родительские элементы.
текст
Например, есть ресторан, который предоставляет различные блюда. Каждый стол имеет меню. В меню перечислены блюда, о которых находится ресторан, в том числе выпечка для завтрака, обед, ужин и т. Д. Каждое блюдо имеет множество пунктов меню. Предполагая, что как пункты меню, так и все меню должны быть напечатаны, и могут быть добавлены подразделения, такие как новые блюда, можно добавить для обеда, и сахар может быть добавлен для пунктов меню, таких как кофе.
В этом случае мы можем использовать комбинацию для представления этого содержимого в качестве иерархий. Давайте разберем наши шаги реализации один за другим.
Первым шагом является реализация нашей функции «абстрактный класс» Menucomponent:
Кода -копия выглядит следующим образом:
var menucomponent = function () {
};
Menucomponent.prototype.getName = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.getDescription = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.getprice = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.isvegetarian = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.print = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.add = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.remove = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Menucomponent.prototype.getchild = function () {
Выбросить новую ошибку («Этот метод должен быть переписан!»);
};
Эта функция предоставляет два типа методов, один из них заключается в получении информации, такой как цена, имя и т. Д., А другой - общий метод работы, такой как печать, добавление, удаление и получение подменю.
Второй шаг - создать основные блюда:
Кода -копия выглядит следующим образом:
var menuitem = function (sname, sdescription, bvegetarian, nprice) {
Menucomponent.apply (это);
this.sname = sname;
this.sdescription = sdescription;
this.bvegetarian = bvegetarian;
this.nprice = nprice;
};
Menuitem.prototype = new Menucomponent ();
Menuitem.prototype.getName = function () {
вернуть this.sname;
};
Menuitem.prototype.getDescription = function () {
вернуть это.sdescription;
};
Menuitem.prototype.getprice = function () {
вернуть это.nprice;
};
Menuitem.prototype.isvegetarian = function () {
вернуть это.bvegetarian;
};
Menuitem.prototype.print = function () {
console.log (this.getName () + ":" + this.getDescription () + "," + this.getPrice () + "Euros");
};
Как видно из кода, мы перестроили только 4 метода получения информации и методов печати и не перегружали другие 3 метода работы, поскольку основные блюда не включают способы добавления, удаления и получения подразделений.
Шаг 3: Создайте посуду:
Кода -копия выглядит следующим образом:
var menu = function (sname, sdescription) {
Menucomponent.apply (это);
this.amenucomponents = [];
this.sname = sname;
this.sdescription = sdescription;
this.createiterator = function () {
Выбросить новую ошибку («Этот метод должен быть перезаписан!»);
};
};
Menu.prototype = new Menucomponent ();
Menu.prototype.add = function (omenucomponent) {
// Добавить замену
this.amenucomponents.push (orecomomponent);
};
Menu.prototype.remove = function (Omenucomponent) {
// Удалить заменители
var amenuitems = [];
var nmenuitem = 0;
var nlenmenuitems = this.amenucomponents.length;
var oitem = null;
for (; nmenuitem <nlenmenuitems;) {
oitem = this.amenucomponents [nmenuitem];
if (oitem! == Omenucomponent) {
amenuitems.push (oitem);
}
nmenuitem = nmenuitem + 1;
}
this.amenucomponents = amenuitems;
};
Menu.prototype.getchild = function (nindex) {
// Получить указанную замену
вернуть это. Амнукомпоненты [nindex];
};
Menu.prototype.getName = function () {
вернуть this.sname;
};
Menu.prototype.getDescription = function () {
вернуть это.sdescription;
};
Menu.prototype.print = function () {
// печатать текущие блюда и все подразделения
console.log (this.getName () + ":" + this.getDescription ());
console.log ("---------------------------------------------");
var nmenucomponent = 0;
var nlenmenucomponents = this.amenucomponents.length;
var ormenucomponent = null;
for (; nmenucomponent <nlenmenucomponents;) {
ormenucomponent = this.amenucomponents [nmenucomponent];
omenucomponent.print ();
nmenucomponent = nmenucomponent + 1;
}
};
Обратите внимание, что в дополнение к реализации методов добавления, удаления и получения, метод печати печати должен сначала распечатать текущую информацию о блюдах, а затем зацикливаться на печать всей информации о подразделениях.
Шаг 4: Создайте указанное блюдо:
Мы можем создать несколько настоящих блюд, таких как ужин, кофе, выпечка и т. Д. Все они используют меню в качестве своего прототипа, а код выглядит следующим образом:
Кода -копия выглядит следующим образом:
var dinnermenu = function () {
Menu.Apply (это);
};
Dinnermenu.prototype = new Menu ();
var cafemenu = function () {
Menu.Apply (это);
};
Cafemenu.prototype = new Menu ();
var pancakehousemenu = function () {
Menu.Apply (это);
};
Pancakehousemenu.prototype = new Menu ();
Шаг 5: Создайте контейнер из меню - книга меню:
Кода -копия выглядит следующим образом:
var Mattress = function (amenus) {
this.amenus = amenus;
};
Mattress.prototype.printmenu = function () {
this.amenus.print ();
};
Эта функция принимает массив меню в качестве параметра, а значение предоставляет метод PrintMenu для печати всех содержимого меню.
Шаг 6, метод вызова:
Кода -копия выглядит следующим образом:
var opancakehousemenu = новое меню («меню« Блин -хаус »,« Завтрак »);
var Odinnermenu = новое меню («Меню ужина», «Обед»);
var ocoffeemenu = новое меню («Меню кафе», «Ужин»);
var oallmenus = новое меню («Все меню», «Все меню объединены»);
oallmenus.add (opancakehousemenu);
oallmenus.add (Odinnermenu);
Odinnermenu.add (New Menuitem («Паста», спагетти с соусом маринара и кусочек хлеба закваски », True, 3,89));
Odinnermenu.add (ocoffeemenu);
ocoffeemenu.add (new Menuitem («Express», «Кофе с машины», ложь, 0,99));
var Omattress = новый матрас (Oallmenus);
console.log ("---------------------------------------------");
omattress.printmenu ();
console.log ("---------------------------------------------");
Студенты, знакомые с студентами, знакомыми с ASP.NET Control Development, выглядят знакомыми?
Суммировать
Сценарий использования режима комбинации очень ясен:
Когда вы хотите представить часть объекта - общая иерархия;
Вы хотите, чтобы пользователь игнорировал разницу между комбинированным объектом и одним объектом, и пользователь будет использовать все объекты в комбинированной структуре равномерно (методы)
Кроме того, этот рисунок часто используется с декораторами. Они обычно имеют общий родительский класс (то есть прототип), поэтому украшение должно поддерживать интерфейсы компонентов с помощью операций добавления, удаления и getChild.