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

首頁 > 編程 > JavaScript > 正文

JavaScript設計模式開發中組合模式的使用教程

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

我們平時開發過程中,一定會遇到這種情況:同時處理簡單對象和由簡單對象組成的復雜對象,這些簡單對象和復雜對象會組合成樹形結構,在客戶端對其處理的時候要保持一致性。比如電商網站中的產品訂單,每一張產品訂單可能有多個子訂單組合,比如操作系統的文件夾,每個文件夾有多個子文件夾或文件,我們作為用戶對其進行復制,刪除等操作時,不管是文件夾還是文件,對我們操作者來說是一樣的。在這種場景下,就非常適合使用組合模式來實現。

基本知識

組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
組合模式主要有三個角色:
(1)抽象組件(Component):抽象類,主要定義了參與組合的對象的公共接口
(2)子對象(Leaf):組成組合對象的最基本對象
(3)組合對象(Composite):由子對象組合起來的復雜對象
理解組合模式的關鍵是要理解組合模式對單個對象和組合對象使用的一致性,我們接下來說說組合模式的實現加深理解。
組合模式算是為在頁面動態創建UI量身定做的,你可以只使用一條命=命令為許多對象初始化一些復雜的或者遞歸的操作.組合模式提供了兩個有點:
(1)允許你將一組對象當成特定的對象.組合對象(A composite)和組成它的子對象實現相同的操作.對組合對象執行某一個操作將會使該對象下的所有子對象執行相同的操作.因此你不僅可以無縫的替換單個對象為一組對象集合,反過來也一樣.這些獨立的對象之間即所謂松散耦合的.
(2)組合模式會將子對象集組合成樹結構并且允許遍歷整個樹.這樣可以隱藏內部實現并且允許你以任意的方式組織子對象.這個對象(組合對象)的任何代碼將不會依賴內部子對象的實現.

組合模式的實現

(1)最簡單的組合模式

HTML文檔的DOM結構就是天生的樹形結構,最基本的元素醉成DOM樹,最終形成DOM文檔,非常適用適用組合模式。
我們常用的jQuery類庫,其中組合模式的應用更是頻繁,例如經常有下列代碼實現:

$(".test").addClass("noTest").remove("test");

這句簡單的代碼就是獲取class包含test的元素,然后進行addClass和removeClass處理,其中不論$(“.test”)是一個元素,還是多個元素,最終都是通過統一的addClass和removeClass接口進行調用。
我們簡單模擬一下addClass的實現:

var addClass = function (eles, className) {  if (eles instanceof NodeList) {    for (var i = 0, length = eles.length; i < length; i++) {      eles[i].nodeType === 1 && (eles[i].className += (' ' + className + ' '));    }  }  else if (eles instanceof Node) {    eles.nodeType === 1 && (eles.className += (' ' + className + ' '));  }  else {    throw "eles is not a html node";  }}addClass(document.getElementById("div3"), "test");addClass(document.querySelectorAll(".div"), "test");

這段代碼簡單的模擬了addClass的實現(暫不考慮兼容性和通用性),很簡單地先判斷節點類型,然后根據不同類型添加className。對于NodeList或者是Node來說,客戶端調用都是同樣的使用了addClass這個接口,這個就是組合模式的最基本的思想,使部分和整體的使用具有一致性。

(2)典型的例子

前面我們提到一個典型的例子:產品訂單包含多個產品子訂單,多個產品子訂單組成一個復雜的產品訂單。由于Javascript語言的特性,我們將組合模式的三個角色簡化成2個角色:
(1)子對象:在這個例子中,子對象就是產品子訂單
(2)組合對象:這里就是產品的總訂單
假設我們開發一個旅游產品網站,其中包含機票和酒店兩種子產品,我們定義了子對象如下:

function FlightOrder() { }FlightOrder.prototyp.create = function () {  console.log("flight order created");}function HotelOrder() { }HotelOrder.prototype.create = function () {  console.log("hotel order created");}

上面的代碼定義了兩個類:機票訂單類和酒店訂單類,每個類都有各自的訂單創建方法。
接下來我們創建一個總訂單類:

function TotalOrders() {  this.orderList = [];}TotalOrders.prototype.addOrder = function (order) {  this.orderList.push(order);}TotalOrders.prototype.create = function (order) {  for (var i = 0, length = this.orderList.length; i < length; i++) {    this.orderList[i].create();  }}

這個對象主要有3個成員:訂單列表,添加訂單的方法,創建訂單的方法。
在客戶端使用的時候如下:

var flight = new FlightOrder();flight.create();var orders = new TotalOrders();orders.addOrder(new FlightOrder());orders.addOrder(new HotelOrder());orders.create();

客戶端調用展示了兩種方式,一種是單一的創建機票訂單,一種是創建多張訂單,但最終都是通過create方法進行創建,這就是一個很典型的組合模式的應用場景。

總結
組合模式并不難理解,它主要解決的是單一對象和組合對象在使用方式上的一致性問題。如果對象具有明顯的層次結構并且想要統一地使用它們,這就非常適合使用組合模式。在Web開發中,這種層次結構非常常見,很適合使用組合模式,尤其是對于JS來說,不用拘泥于傳統面向對象語言的形式,靈活地利用JS語言的特性,達到對部分和整體使用的一致性。
(1)使用組合模式的場景
在遇到下面兩種情況的時候才使用組合模式
A.含有某種層級結構的對象集合(具體結構在開發過程中無法確定)
B.希望對這些對象或者其中的某些對象執行某種操作
(2)組合模式的缺點
因為組合對象的任何操作都會對所有的子對象調用同樣的操作,所以當組合的結構很大時會有性能問題。還有就是使用組合模式封裝HTML時要選擇合適的標簽,比如table就不能用于組合模式,葉子節點不明顯

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久尿| 夜色77av精品影院| 国产精品www色诱视频| 亚洲美女在线看| 91午夜理伦私人影院| 欧美国产高跟鞋裸体秀xxxhd| 欧美日韩色婷婷| 久久久最新网址| 日本高清不卡的在线| 日日狠狠久久偷偷四色综合免费| 国产精品视频一区国模私拍| www.久久久久| 国产成人+综合亚洲+天堂| 日韩中文第一页| 久久精品在线播放| 亚洲美女在线看| 欧美野外猛男的大粗鳮| 一区二区三区动漫| 欧美大片欧美激情性色a∨久久| 亚洲精品久久久久久久久久久| 日本高清视频一区| 国产91精品视频在线观看| 亚洲伊人久久大香线蕉av| 久久国产视频网站| 日韩在线免费高清视频| 亚洲视频日韩精品| 成人福利视频在线观看| 2021久久精品国产99国产精品| 欧美成人免费va影院高清| 91在线视频九色| 欧美性20hd另类| 中文字幕日韩av电影| 精品久久国产精品| 麻豆一区二区在线观看| 欧美裸体xxxx| 69久久夜色精品国产69| 在线观看精品国产视频| 午夜精品免费视频| 国外日韩电影在线观看| 社区色欧美激情 | 中文字幕免费精品一区高清| 国产精品永久在线| 国产精品夜色7777狼人| 日韩av三级在线观看| 国模吧一区二区三区| 91精品国产91久久| 成人做爰www免费看视频网站| 国产成人精品久久二区二区| xxxx欧美18另类的高清| 久久精品国产精品| 亚洲人成网站999久久久综合| 亚洲国产精品久久精品怡红院| 亚洲欧美激情精品一区二区| 91av在线国产| 一夜七次郎国产精品亚洲| 亚洲第一网站男人都懂| 精品国产一区二区三区四区在线观看| 97在线精品国自产拍中文| 国产第一区电影| 色久欧美在线视频观看| 91香蕉嫩草神马影院在线观看| 欧美成人国产va精品日本一级| 欧美成人免费va影院高清| 日本精品性网站在线观看| 91久久久久久久久久久| 日韩女优在线播放| 欧美精品久久久久久久久| 国产日韩在线看| 国产亚洲aⅴaaaaaa毛片| 久久色免费在线视频| 97久久精品在线| 亚洲免费影视第一页| 亚洲毛片在线看| 亚洲区在线播放| 91sao在线观看国产| 国产精品情侣自拍| 国产亚洲精品综合一区91| 亚洲午夜未删减在线观看| 国产精品亚洲视频在线观看| 亚洲精品综合精品自拍| 国产精品永久免费在线| 精品国产老师黑色丝袜高跟鞋| 久久久亚洲国产天美传媒修理工| 精品国产户外野外| 久久精品青青大伊人av| 精品久久久久久久久中文字幕| 91精品国产777在线观看| 亚洲成人av资源网| 久久99精品久久久久久噜噜| 成人福利在线视频| 91久久久亚洲精品| 日韩成人中文电影| 亚洲欧美成人在线| 992tv在线成人免费观看| 97色在线观看免费视频| 国产日韩欧美夫妻视频在线观看| 久久天堂av综合合色| 狠狠爱在线视频一区| 精品福利视频导航| 欧美日韩国产丝袜另类| 日本免费久久高清视频| 精品久久久久久国产91| 91免费精品视频| 日本成人精品在线| 国产欧美精品在线| 久久国产视频网站| 亚洲精品456在线播放狼人| 成人久久一区二区三区| 深夜福利日韩在线看| 久久久久久久久久久av| 日日摸夜夜添一区| 久久精品中文字幕免费mv| 亚洲成人久久一区| 91久久国产综合久久91精品网站| 亚洲自拍高清视频网站| 国产成人精品在线观看| www国产亚洲精品久久网站| 久久福利网址导航| 亚洲欧美精品一区二区| 成人乱人伦精品视频在线观看| 97在线视频免费播放| 亚洲美女又黄又爽在线观看| 欧美成人午夜激情在线| 国产91精品高潮白浆喷水| 尤物99国产成人精品视频| 国产精品jizz在线观看麻豆| 91精品久久久久久久久久久久久| 日本高清不卡的在线| 中文字幕欧美精品日韩中文字幕| 国内久久久精品| 亚洲综合在线中文字幕| 高清一区二区三区日本久| 久久久国产精品一区| 欧美国产日韩一区二区| 国产成人精品一区| 最近2019中文字幕一页二页| 亚洲少妇中文在线| 按摩亚洲人久久| 国产精品丝袜白浆摸在线| 日韩中文字幕免费看| 日韩在线观看电影| 成人av.网址在线网站| 91av在线精品| 91精品国产91久久久久久| 久久久国产精彩视频美女艺术照福利| 高清欧美性猛交xxxx黑人猛交| 2019中文字幕全在线观看| 国产一区二区在线播放| 色播久久人人爽人人爽人人片视av| 中文字幕av一区中文字幕天堂| 欧美在线播放视频| 亚洲色图13p| 九九热精品在线| 欧美成人激情图片网| 日av在线播放中文不卡| 欧美中文字幕视频在线观看| 精品香蕉在线观看视频一| 91精品国产91久久久久| 久久久久久12| 国产精品嫩草视频| 亚洲欧美日韩天堂一区二区| 久久久精品视频在线观看| 伊人久久久久久久久久久| 中文字幕日韩在线播放|