определение
Комбинация, как следует из названия, относится к созданию одного объекта с объектом, содержащим несколько компонентов. Эта единственная сущность будет служить точкой доступа для всех этих компонентов, и, хотя это значительно упрощает операции, она также может быть довольно обманчивым, так как нет неявного способа четко указать, сколько компонентов содержит комбинация.
Цель комбинированного режима состоит в том, чтобы отделить клиентскую программу от внутренней архитектуры сложных элементов, чтобы клиентская программа одинаково относилась ко всем детствам.
Каждый детский узел может сделать сложное существование. Для родительского узла нет необходимости знать сложность детского узла или реализовать сложность детского узла. Он должен только обращать внимание на конкретные методы детского узла, чтобы можно было использовать детский узел. Упрощает отношения между отцом и сыном.
То же самое верно для детских узлов. Чрезмерное воздействие на интерфейс иногда является злоупотреблением, а также снижает зависимость от внешних факторов.
Пример
Нам лучше использовать комбинацию иллюзий. На следующем изображении вы можете увидеть два разных типа объектов: контейнеры и библиотеки - это комбинации, а изображения - лезвия. Комбинации могут нести детей, но, как правило, не выполняют больше поведения. Клинок содержит подавляющее большинство поведения, но не может нести детей, по крайней мере, не в традиционных примерах комбинации.
Этот пример создает библиотеку изображений в качестве примера комбинации шаблона. Есть только три уровня: альбом, библиотека и изображение. Альбом и библиотека будут объединены, а изображение - лезвие, как показано на изображении выше. Это более явная структура, чем требует самой комбинации, но для этого примера имеет смысл ограничить эти уровни только комбинациями или лезвиями. Стандартная комбинация не ограничивает, какие структурные уровни могут иметь лезвия, и при этом она не ограничивает количество лопастей.
Для начала вы должны сначала создать GalleryComposite "Class" для ваших альбомов и библиотек. Обратите внимание, что я использую jQuery для выполнения операций DOM для упрощения процесса.
var GalleryComposite = function (Heading, id) {this.children = []; this.element = $ ('<div id = "' + id + '"> </div>') .append ('<h2>' + Heading + '</h2>');} galleryComposite.prototype = {add: function (Child) {this.children.push (child); this.element.append (child.getElement ()); }, remove: function (ребенок) {for (var node, i = 0; node = this.getchild (i); i ++) {if (node == child) {this.children.splice (i, 1); this.element.detach (child.getElement ()); вернуть истину; } if (node.remove (ребенок)) {return true; }} вернуть false; }, getChild: function (i) {return this.children [i]; }, Hide: function () {for (var node, i = 0; node = this.getchild (i); i ++) {node.hide (); } this.element.hide (0); }, show: function () {for (var node, i = 0; node = this.getchild (i); i ++) {node.show (); } this.element.show (0); }, getElement: function () {return this.element; }}Это место немного сложно, могу я позволить мне объяснить больше? Мы строим эту комбинацию, используя методы Add, удалить и getChild GetChild. Этот пример на самом деле не использует удаление и getChild, но они очень полезны для создания динамических комбинаций. Методы прятки, шоу и getElement используются для манипулирования DOM. Эта комбинация предназначена для представления пользователям на странице в качестве представления библиотеки. Эта комбинация может управлять этими элементами библиотеки через Hide and Show. Если вы позвоните в Hide на альбоме, весь альбом исчезнет, или вы также можете назвать его на одном изображении, чтобы только это изображение исчезнуло.
Теперь создайте класс галереи. Обратите внимание, что он использует точно тот же метод, что и GalleryComposite. Другими словами, они реализуют один и тот же интерфейс, за исключением того, что изображение является лезвием, поэтому на методе, связанном с детьми, на самом деле никаких действий не выполняется, как если бы у него не было ребенка. Комбинация должна выполняться с одним и тем же интерфейсом, потому что комбинированный элемент не знает, является ли это еще одним комбинированным элементом или лезвием, который он добавляется сами по себе, поэтому, если вы попытаетесь вызвать эти методы на своих детей, вам необходимо работать совершенно хорошо без каких -либо ошибок.
var galleryImage = function (src, id) {this.children = []; this.element = $ ('<img />') .attr ('id', id) .attr ('src', src);} galleryimage.prototype = {// из -за этого листа, он не использует эти методы, // но должен реализовать их, чтобы считать как реализация // составной интерфейс: function () {}, remoft: {) {) {) {) {) {) {). }, Hide: function () {this.element.hide (0); }, show: function () {this.element.show (0); }, getElement: function () {return this.element; }}Учитывая, что вы создали прототип объекта, вы теперь можете его использовать. Снизу вы можете увидеть код для фактического создания библиотеки изображений.
var container = new GalleryComposite ('', 'allgalleries'); var gallery1 = new GalleryComposite ('Gallery 1', 'Galleries1'); VAR Gallery2 = New GalleryComposite ('Галерея 2', 'Gallery2'); var Image1 = new GalleryImage ('image1.jpg', 'img1'); 'img2'); var image3 = new GalleryImage ('image3.jpg', 'img3'); var image4 = new GalleryImage ('image4.jpg', 'img4'); gallery1.add (image1); gallery1.add (image2); gallery2.add (image3); gallery2.add (image4); container.add (галерея1); контейнер. up.container.getElement (). AppendTo ('body'); intainer.show ();Преимущества комбинированного режима:
Простые операции также могут привести к сложным результатам. Вам нужно только выполнить операции на объекте верхнего уровня и позволить каждому дочернему объекту передать эту операцию самостоятельно. Это особенно полезно для тех операций, которые повторяются.
В комбинированном режиме связь между отдельными объектами очень свободна. Пока они реализуют один и тот же интерфейс, это лишь небольшая помощь, чтобы изменить свои позиции или обмениваться их. Он способствует повторному использованию кода, а также способствует реконструкции кода.
Всякий раз, когда операция выполняется на комбинированном объекте верхнего уровня, на самом деле это глубокий поиск всей структуры, чтобы найти узлы, и программист, который создал комбинированный объект, не знает этих деталей. Это очень легко добавить, удалить и найти узлы в этой иерархии.
Недостатки комбинированного режима:
Простота использования комбинированного объекта может маскировать стоимость каждой операции, которую он поддерживает. Поскольку любая операция, вызванная комбинированным объектом, будет передана всем его субъектам. Если эта иерархия велика, будет затронута производительность системы. Нормальная работа комбинированного режима требует некоторой формы интерфейса.
При объединении объектов и классов узлов используются в качестве инструментов обертывания для элементов HTML, комбинированные объекты должны соответствовать правилам использования HTML. Например, таблицу трудно преобразовать в комбинированный объект.
Чем строчее проверка интерфейса, тем надежным будет комбинированный класс объектов.