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