亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

設計模式中的組合模式在JavaScript程序構建中的使用

2019-11-20 10:01:04
字體:
來源:轉載
供稿:網友

定義

組合,顧名思義是指用包含多個部件的對象創建單一實體。 這個單一實體將用作所有這些部件的訪問點,雖然這大大簡化了操作,但也可能具有相當的欺騙性,因為沒有哪種隱性方式明確表明該組合包含多少部件。
組合模式的目標是解耦客戶程序與復雜元素內部架構,使得客戶程序對待所有子元素都一視同仁。

每個子節點都可以使復雜的存在,對于父節點來說,不需要知道子節點的復雜性或者實現子節點的復雜性,只需要關注子節點的特定方法,便可以使用子節點。簡化了父和子之間的關系。

對于子節點來說也是一樣的,過多的接口暴露有時候也是一種濫用,同時也減少了對外部的依賴。

示例
我們最好使用例證解說組合。 在下圖中,您可以看到兩種不同類型的對象: 容器和庫是組合,圖像是葉片。 組合可承載子項,但一般不會實施更多行為。 葉片包含絕大多數行為,但不能承載子項,至少在傳統的組合示例中不可以。

2016518103600142.png (550×341)

此示例創建圖片庫,將其作為組合模式示例。 只有三個層次: 專輯、庫和圖像。 專輯和庫將作為組合,圖像是葉片,如上面那張圖所示。這是一種比組合本身需求更加明確的結構,但對于本示例而言,將這些層次僅限制為組合或葉片很有意義。 標準組合不會限制哪些結構層次可以具有葉片,也不會限制葉片數量。

要開始操作,應首先創建用于專輯和庫的 GalleryComposite“類”。 請注意,我正在使用 jQuery 執行 DOM 操作以簡化過程。

var GalleryComposite = function (heading, id) {  this.children = [];  this.element = $('<div id="' + id + '" class="composite-gallery"></div>')  .append('<h2>' + heading + '</h2>');}GalleryComposite.prototype = {  add: function (child) {    this.children.push(child);    this.element.append(child.getElement());  },  remove: function (child) {    for (var node, i = 0; node = this.getChild(i); i++) {      if (node == child) {        this.children.splice(i, 1);        this.element.detach(child.getElement());        return true;      }      if (node.remove(child)) {        return true;      }    }    return 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, remove, 和getChild getChild 方法構建這一組合。 本示例不會實際使用 remove 和 getChild,但它們對于創建動態組合非常有用。 hide, show, 和getElement 方法則用來操縱 DOM。 該組合旨在作為庫的 表示在頁面上向用戶展示。 該組合可通過 hide 和 show控制這些庫元素。 如果在專輯上調用 hide,則整個專輯將消失,或者您也可以只在單一圖像上調用它,這樣只有該圖像會消失。

現在,創建一個 GalleryImage類。 請注意,它使用的方法與 GalleryComposite完全相同。 換句話說,它們實現同一接口,不同的是該圖像是葉片,因此不會實際對子項相關方法執行任何操作,就像不具有任何子項一樣。 必須使用同一接口運行該組合,因為組合元素不知道自身添加的是另一個組合元素還是葉片,因此如果嘗試在其子項上調用這些方法,則需要運行完全正常,沒有任何錯誤。

var GalleryImage = function (src, id) {  this.children = [];  this.element = $('<img />')  .attr('id', id)  .attr('src', src);}GalleryImage.prototype = {  // Due to this being a leaf, it doesn't use these methods,  // but must implement them to count as implementing the  // Composite interface  add: function () { },  remove: function () { },  getChild: function () { },  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', 'gallery1');var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');var image1 = new GalleryImage('image1.jpg', 'img1');var image2 = new GalleryImage('image2.jpg', '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(gallery1);container.add(gallery2);// Make sure to add the top container to the body,// otherwise it'll never show up.container.getElement().appendTo('body');container.show();

組合模式之利:
簡單的操作也能產生復雜的結果,只需對最頂層的對象執行操作,讓每一個子對象自己傳遞這個操作即可。這對于那些再三執行的操作尤其有用。

在組合模式中,各個對象之間的耦合非常松散。只要它們實現了同樣的接口那么改變它們的位置或互換它們只是舉手之勞。著促進了代碼的重用,也有利于代碼重構。

每當對頂層組合對象執行一個操作時,實際上是在對整個結構進行深度優先的搜索以查找節點,而創建組合對象的程序員對這些細節一無所知。在這個層次體系中添加、刪除和查找節點都非常容易。

組合模式之弊:
組合對象的易用性可能掩蓋了它所支持的每一種操作的代價。由于組合對象調用的任何操作都會被傳遞到它的所有子對象如果這個層次體系很大的話,系統的性能將會受到影響。組合模式的正常運作需要用到某種形式的接口。

組合對象和節點類被用作HTML元素的包裝工具時,組合對象必須遵守HTML的使用規則。例如,表格就很難轉化為一個組合對象。

接口檢查越嚴格,組合對象類也就越可靠。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情久久久久| 久久久久久尹人网香蕉| 国产在线精品一区免费香蕉| 欧美激情亚洲综合一区| 亚洲一区二区中文字幕| 亚洲一级黄色av| 成人444kkkk在线观看| 日韩av综合网| 欧美丰满少妇xxxxx| 日本乱人伦a精品| 日韩精品免费在线| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品免费一区| 欧美激情精品久久久久久免费印度| 最新国产精品拍自在线播放| 亚洲一区二区精品| 亚洲精品一区中文| 国内精品在线一区| www亚洲精品| 久久久精品久久久| 国产成人一区二区三区电影| 国产婷婷97碰碰久久人人蜜臀| 国a精品视频大全| 欧美xxxx做受欧美.88| 亚洲片国产一区一级在线观看| 欧美一级大片在线观看| 亚洲国产另类久久精品| 欧美夫妻性视频| 欧美极品少妇xxxxⅹ喷水| 国外日韩电影在线观看| 国产情人节一区| 日韩久久精品电影| 亚洲精品久久久久久久久久久久久| 欧美激情极品视频| 久久精品电影一区二区| 国内精品视频在线| 亚洲精品电影网在线观看| 亚洲free性xxxx护士白浆| 亚洲精品自在久久| 欧美日韩在线观看视频小说| 国产精品中文字幕久久久| 亚洲无限av看| 亚洲欧美成人一区二区在线电影| 国产成人精品一区二区三区| 亚洲欧美日韩图片| 国产一区二区三区在线播放免费观看| 国产91精品久久久久| 久久夜精品va视频免费观看| 成人观看高清在线观看免费| 日韩有码在线视频| 欧美激情在线有限公司| 怡红院精品视频| 97视频免费在线观看| 78m国产成人精品视频| 青青久久av北条麻妃海外网| 亚洲综合社区网| 国产美女精品免费电影| 国产精品v日韩精品| 午夜精品一区二区三区在线播放| 成人激情综合网| 国产日韩av高清| 亚洲人成网站在线播| 国产91精品不卡视频| 九九九久久久久久| 亚洲第一福利在线观看| 欧美激情欧美狂野欧美精品| 亚洲免费视频观看| 91精品在线观看视频| 日韩欧美精品在线观看| 亚洲欧美国产一本综合首页| 欧美激情高清视频| 91精品久久久久久久久久久久久| 亚洲精品久久久久| 亚洲最大在线视频| 久久这里只有精品99| 亚洲欧美日韩爽爽影院| 欧洲美女免费图片一区| 色综合视频一区中文字幕| 成人免费自拍视频| 欧美制服第一页| 少妇av一区二区三区| 国产精品免费一区豆花| 91精品国产色综合| 97在线看免费观看视频在线观看| 亚洲精品www久久久久久广东| 日韩欧美视频一区二区三区| 日韩精品视频中文在线观看| 久久久久国产精品一区| 国产美女精品视频| 久久久最新网址| 亚洲欧美在线免费观看| 亚洲午夜精品视频| 日韩亚洲在线观看| 欧美激情综合色综合啪啪五月| 亚洲xxxx视频| 国产91色在线| 国产伊人精品在线| 久久99精品视频一区97| 亚洲激情国产精品| 一区二区三区视频观看| www.国产精品一二区| 91精品国产色综合久久不卡98| 中文字幕国产亚洲| 色偷偷9999www| 精品中文字幕久久久久久| 亚洲国产成人久久| 欧美日韩一区二区在线播放| 久久九九有精品国产23| 精品久久久久久电影| 国产成人拍精品视频午夜网站| 日韩在线观看免费全| 色老头一区二区三区| 91免费国产网站| 欧美日韩一区二区三区在线免费观看| 在线国产精品播放| 亚洲男人天天操| 欧美日韩中文在线| y97精品国产97久久久久久| 国产色婷婷国产综合在线理论片a| 亚洲香蕉av在线一区二区三区| 久久色精品视频| 91欧美视频网站| 日本欧美国产在线| 成人在线中文字幕| 欧美精品手机在线| 国语自产精品视频在线看| 色哟哟入口国产精品| 亚洲精品国产精品乱码不99按摩| 欧美国产精品日韩| 欧美黑人视频一区| 欧美最猛性xxxxx亚洲精品| 久久久电影免费观看完整版| 日韩在线免费av| 久久的精品视频| 欧美丰满片xxx777| 国产精品久久久久久久久久| 日韩国产欧美精品一区二区三区| 欧美日韩第一页| 91免费的视频在线播放| 永久免费精品影视网站| 国产精品久久久av久久久| 美女扒开尿口让男人操亚洲视频网站| 欧美丝袜美女中出在线| 国内精品400部情侣激情| 精品国产一区二区三区久久久狼| 成人亚洲欧美一区二区三区| 91精品在线一区| 国产97色在线|日韩| 欧美视频在线观看免费| 欧美日韩亚洲91| 北条麻妃在线一区二区| 国产97色在线| 97精品国产97久久久久久免费| 日本最新高清不卡中文字幕| 国产精品精品一区二区三区午夜版| 社区色欧美激情 | yellow中文字幕久久| 亚洲free性xxxx护士hd| 久久国产精品久久久久久久久久| 亚洲国产精品yw在线观看| 中文欧美日本在线资源| 日产日韩在线亚洲欧美| 国产精品视频在线播放| 91精品一区二区|