摘要:更多前端技術(shù)和知識點,搜索訂閱號菌訂閱組合模式在對象間形成樹形結(jié)構(gòu)組合模式中基本對象和組合對象被一致對待無須關(guān)心對象有多少層調(diào)用時只需在根部進(jìn)行調(diào)用實現(xiàn)原理創(chuàng)建宏任務(wù)并維護一個任務(wù)列表創(chuàng)建宏任務(wù)方法將到中創(chuàng)建方法循環(huán)遍歷中的對象對象必須擁有
?? 更多前端技術(shù)和知識點,搜索訂閱號 JS 菌 訂閱
組合模式在對象間形成樹形結(jié)構(gòu);
組合模式中基本對象和組合對象被一致對待;
無須關(guān)心對象有多少層, 調(diào)用時只需在根部進(jìn)行調(diào)用;
實現(xiàn)原理創(chuàng)建宏任務(wù)并維護一個任務(wù)列表 list
創(chuàng)建宏任務(wù)方法 add 將 task push 到 list 中
創(chuàng)建 execute 方法循環(huán)遍歷 list 中的 task 對象
task 對象必須擁有一個名為 execute 的方法(用來在宏任務(wù)中遍歷 list)
代碼實現(xiàn)const MacroCommand = function() { this.lists = [] // 宏任務(wù)維護一個任務(wù)列表 } MacroCommand.prototype.add = function(task) { this.lists.push(task) // add 方法增加任務(wù) } MacroCommand.prototype.execute = function() { for (let index = 0; index < this.lists.length; index++) { this.lists[index].execute() // execute 方法執(zhí)行任務(wù) } } const command1 = new MacroCommand() // 通過 new 操作符創(chuàng)建任務(wù) command1.add({ execute: () => { console.log("command1-1") } }) command1.add({ execute: () => { console.log("command1-2") } }) const command2 = new MacroCommand() command2.add({ execute: () => { console.log("command2-1") } }) command2.add({ execute: () => { console.log("command2-2") } }) command2.add({ execute: () => { console.log("command2-3") } }) const macroCommand = new MacroCommand() // 假定 macroCommand 為宏任務(wù) macroCommand.add(command1) // 將其他子任務(wù)推如任務(wù)列表 macroCommand.add(command2) macroCommand.execute() // 宏命令執(zhí)行操作后,command 將依次遞歸執(zhí)行 // command1-1 // command1-2 // command2-1 // command2-2 // command2-3應(yīng)用 掃描文件夾
文件夾下面可以為另一個文件夾也可以為文件, 我們希望統(tǒng)一對待這些文件夾和文件, 這種情形適合使用組合模式。
const Folder = function(folder) { this.folder = folder this.lists = [] } Folder.prototype.add = function(res) { this.lists.push(res) } Folder.prototype.scan = function() { console.log(`開始掃描文件夾: ${this.folder}`) for (let index = 0; index < this.lists.length; index++) { this.lists[index].scan() } } const File = function(file) { this.file = file } File.prototype.add = function() { throw Error("文件中不可添加文件") } File.prototype.scan = function() { console.log(`開始掃描文件: ${this.file}`) } const folder = new Folder("根文件夾") const folder1 = new Folder("JS") const folder2 = new Folder("其他") const file = new File("JS prototype") const file1 = new File("CSS 編程藝術(shù)") const file2 = new File("HTML 標(biāo)記語言") const file3 = new File("HTTP-TCP-IP") folder.add(folder1) folder.add(folder2) folder1.add(file) folder2.add(file1) folder2.add(file2) folder2.add(file3) folder.scan() // 開始掃描文件夾: 根文件夾 // 開始掃描文件夾: JS // 開始掃描文件: JS prototype // 開始掃描文件夾: 其他 // 開始掃描文件: CSS 編程藝術(shù) // 開始掃描文件: HTML 標(biāo)記語言 // 開始掃描文件: HTTP-TCP-IP
請關(guān)注我的訂閱號,不定期推送有關(guān) JS 的技術(shù)文章,只談技術(shù)不談八卦
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/106107.html
摘要:安全式組合模式中的抽象構(gòu)件不聲明管理子類的接口,把操作移交給子類完成。組合模式實現(xiàn)樣例使用組合模式實現(xiàn)目錄和課程之間的關(guān)系。 0x01.定義與類型 定義:將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu),使客戶端對單個對象和組合對象保持一致的方式處理 組合模式實現(xiàn)的最關(guān)鍵的地方是:簡單對象和復(fù)合對象必須實現(xiàn)相同的接口,這就是組合模式能夠?qū)⒔M合對象和簡單對象進(jìn)行一致處理的原因。 類型:結(jié)...
摘要:組合模式繼承結(jié)合了構(gòu)造函數(shù)繼承時可以為每個屬性重新初始化,構(gòu)造一個副本的優(yōu)點,以及原型鏈繼承時一次定義處處共享的優(yōu)點。但令我百思不得其解的是,從上面給出的例子來看,組合繼承并沒有調(diào)用兩次超類型構(gòu)造函數(shù)。 最近在閱讀《js權(quán)威指南》的繼承這一章,對于組合模式和寄生組合模式的區(qū)別有點混淆,在多次重讀以及嘗試之后,得到一些心得。 組合模式繼承 結(jié)合了構(gòu)造函數(shù)繼承時可以為每個屬性重新初始化,構(gòu)...
摘要:,對組合對象執(zhí)行的操作可以向下傳遞到葉子節(jié)點進(jìn)行操作。組合模式之圖片庫圖片庫可以有選擇地隱藏或顯示圖片庫的全部或某一部分單獨的或是部分的。 本回內(nèi)容介紹 上一回,聊了橋接模式,做了一道計算題;介一回,聊組合模式(Composite),官方描述組合模式將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu),組合模式使得用戶對單個對象和組合對象的使用具有一致性。 組合模式特性 這里我理了一下,就組...
摘要:組合模式的圖組成部分組合對象為組合中的對象聲明接口,在適當(dāng)?shù)那闆r下,實現(xiàn)所有類共有接口的默認(rèn)行為,聲明用于訪問和管理其子組件的接口。組合模式對單個對象葉子對象和組合對象容器對象的使用具有一致性。 組合模式(Composite Pattern)屬于結(jié)構(gòu)型模式的一種,組合多個對象形成樹形結(jié)構(gòu)來表示部分 - 整體的結(jié)構(gòu)層次,對單個對象(葉子對象)和組合對象(容器對象)的使用具有一致性 概述...
摘要:組合對象包括部件對象和葉對象葉對象相當(dāng)于最小粒度不可再劃分而部件對象也是組合對象是由葉對象組合而成小的組合對象再經(jīng)過不斷組合就成為一個大的組合對象大的組合對象再次組裝就是一個整體代碼通過組合模式組合起來之后具體執(zhí)行請求時是從上而下沿著樹形結(jié) 組合對象,包括部件對象和葉對象.葉對象相當(dāng)于最小粒度,不可再劃分;而部件對象也是組合對象,是由葉對象組合而成.小的組合對象再經(jīng)過不斷組合,就成為一...
摘要:我們可以做一些小改進(jìn)將的拋出異常代碼挪入父類屬于最小單位。完整代碼當(dāng)我們需要在某個子類,實現(xiàn)個性化的業(yè)務(wù)邏輯時,組合模式的缺陷之一正在顯現(xiàn)出來簡化的前提是所有的類都繼承同一個基類,簡化優(yōu)點有時是以降低對象安全為代價。 開篇 如果你注意了目錄,會知道:組合是一個新的開始。在系統(tǒng)代碼設(shè)計的過程中,我們通過繼承來組織代碼,父類與子類,實質(zhì)上對應(yīng)了業(yè)務(wù)的整體規(guī)范與具體需求。所以,我們需要將類按...
閱讀 3544·2021-09-02 09:53
閱讀 1879·2021-08-26 14:13
閱讀 2823·2019-08-30 15:44
閱讀 1405·2019-08-30 14:03
閱讀 2050·2019-08-26 13:42
閱讀 3079·2019-08-26 12:21
閱讀 1352·2019-08-26 11:54
閱讀 1959·2019-08-26 10:46