最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript組合模式Composite Pattern

 更新時間:2022年04月26日 11:12:43   作者:掘金安東尼  
這篇文章主要介紹了學(xué)習(xí)理解JavaScript組合模式,組合模式及Composite Pattern又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象

組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象。

組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它創(chuàng)建了對象組的樹形結(jié)構(gòu)。

樹對象和葉對象接口統(tǒng)一,樹對象增加一個緩存數(shù)組,存儲葉對象。執(zhí)行樹對象方法時,將請求傳遞給其下葉對象執(zhí)行。

// 樹對象 - 文件目錄
class CFolder {
constructor(name) {
this.name = name;
this.files = [];
}
add(file) {
this.files.push(file);
}
scan() {
for (let file of this.files) {
file.scan();
}
}
}
// 葉對象 - 文件
class CFile {
constructor(name) {
this.name = name;
}
add(file) {
throw new Error('文件下面不能再添加文件');
}
scan() {
console.log(`開始掃描文件:${this.name}`);
}
}
let mediaFolder = new CFolder('娛樂');
let movieFolder = new CFolder('電影');
let musicFolder = new CFolder('音樂');
let file1 = new CFile('鋼鐵俠.mp4');
let file2 = new CFile('再談記憶.mp3');
movieFolder.add(file1);
musicFolder.add(file2);
mediaFolder.add(movieFolder);
mediaFolder.add(musicFolder);
mediaFolder.scan();

輸出:

開始掃描文件:鋼鐵俠.mp4
開始掃描文件:再談記憶.mp3

??CFolder??與 ??CFile?? 接口保持一致。執(zhí)行 ??scan()?? 時,若發(fā)現(xiàn)是樹對象,則繼續(xù)遍歷其下的葉對象,執(zhí)行 ??scan()??。

JavaScript 不同于其它靜態(tài)編程語言,實現(xiàn)組合模式的難點是保持樹對象與葉對象之間接口保持統(tǒng)一,可借助 TypeScript 定制接口規(guī)范,實現(xiàn)類型約束。

// 定義接口規(guī)范
interface Compose {
name: string,
add(file: CFile): void,
scan(): void
}
// 樹對象 - 文件目錄
class CFolder implements Compose {
fileList = [];
name: string;
constructor(name: string) {
this.name = name;
}
add(file: CFile) {
this.fileList.push(file);
}
scan() {
for (let file of this.fileList) {
file.scan();
}
}
}
// 葉對象 - 文件
class CFile implements Compose {
name: string;
constructor(name: string) {
this.name = name;
}
add(file: CFile) {
throw new Error('文件下面不能再添加文件');
}
scan() {
console.log(`開始掃描:${this.name}`)
}
}
let mediaFolder = new CFolder('娛樂');
let movieFolder = new CFolder('電影');
let musicFolder = new CFolder('音樂');
let file1 = new CFile('鋼鐵俠.mp4');
let file2 = new CFile('再談記憶.mp3');
movieFolder.add(file1);
musicFolder.add(file2);
mediaFolder.add(movieFolder);
mediaFolder.add(musicFolder);
mediaFolder.scan();

輸出:

開始掃描文件:鋼鐵俠.mp4
開始掃描文件:再談記憶.mp3

需要注意的是:

  • 組合不是繼承,樹葉對象并不是父子對象
  • 葉對象操作保持一致性
  • 葉對象實現(xiàn)冒泡傳遞
  • 不只是簡單的子集遍歷

它的應(yīng)用場景:

  • 優(yōu)化處理遞歸或分級數(shù)據(jù)結(jié)構(gòu)(文件系統(tǒng) - 目錄文件管理);
  • 與其它設(shè)計模式聯(lián)用,如與命令模式聯(lián)用實現(xiàn) “宏命令”。

它的優(yōu)點:忽略組合對象和單個對象的差別,對外一致接口使用;解耦調(diào)用者與復(fù)雜元素之間的聯(lián)系,處理方式變得簡單。

它的缺點:樹葉對象接口一致,無法區(qū)分,只有在運行時方可辨別;包裹對象創(chuàng)建太多,額外增加內(nèi)存負擔(dān)。

到此這篇關(guān)于學(xué)習(xí)理解JavaScript組合模式Composite Pattern的文章就介紹到這了,更多相關(guān)JS組合模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS實現(xiàn)移動端雙指縮放和旋轉(zhuǎn)方法

    JS實現(xiàn)移動端雙指縮放和旋轉(zhuǎn)方法

    這篇文章主要介紹了JS實現(xiàn)移動端雙指縮放和旋轉(zhuǎn)方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • JavaScript中reduce()詳解及使用方法

    JavaScript中reduce()詳解及使用方法

    reduce()方法接收一個函數(shù)做為累加器,數(shù)組中的每一個值(從左到右)開始縮減,最終計算為一個值,下面這篇文章主要給大家介紹了關(guān)于JavaScript中reduce()詳解及使用方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 利用Echarts如何實現(xiàn)多段圓環(huán)圖

    利用Echarts如何實現(xiàn)多段圓環(huán)圖

    這篇文章主要給大家介紹了關(guān)于利用Echarts如何實現(xiàn)多段圓環(huán)圖的相關(guān)資料,文中通過實例代碼代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • 異步安全加載javascript文件的方法

    異步安全加載javascript文件的方法

    這篇文章主要介紹了異步安全加載javascript文件的方法,實例分析了javascript實現(xiàn)文件異步加載的具體技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 繼承行為在 ES5 與 ES6 中的區(qū)別詳解

    繼承行為在 ES5 與 ES6 中的區(qū)別詳解

    這篇文章主要介紹了繼承行為在 ES5 與 ES6 中的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JS通過URL下載文件并重命名兩種方式代碼

    JS通過URL下載文件并重命名兩種方式代碼

    前端下載文件方法很多,url是文件地址,下面這篇文章主要給大家介紹了關(guān)于JS通過URL下載文件并重命名的兩種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • JavaScript實現(xiàn)表格排序方法

    JavaScript實現(xiàn)表格排序方法

    JavaScript實現(xiàn)表格排序方法,需要的朋友可以參考一下
    2013-06-06
  • Javascript ES6中數(shù)據(jù)類型Symbol的使用詳解

    Javascript ES6中數(shù)據(jù)類型Symbol的使用詳解

    Symbol類型是es6新增的一個數(shù)據(jù)類型,Symbol值通過Symbol函數(shù)生成Symbol類型是保證每個屬性的名字都是獨一無二的,對于一個對象由對個模塊構(gòu)成的情況非常有用,本文主要介紹了Javascript ES6中數(shù)據(jù)類型Symbol使用的相關(guān)資料,需要的朋友可以參考下。
    2017-05-05
  • JS實現(xiàn)動態(tài)給圖片添加邊框的方法

    JS實現(xiàn)動態(tài)給圖片添加邊框的方法

    這篇文章主要介紹了JS實現(xiàn)動態(tài)給圖片添加邊框的方法,涉及javascript操作圖片border的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • js中indexOf()的簡單使用示例

    js中indexOf()的簡單使用示例

    indexOf在js中有著重要的作用,可以判斷一個元素是否在數(shù)組中存在,或者判斷一個字符是否在字符串中存在,下面這篇文章主要給大家介紹了關(guān)于js中indexOf()簡單使用的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評論

江北区| 屯留县| 类乌齐县| 蛟河市| 闸北区| 阿克苏市| 阳东县| 本溪市| 黔江区| 馆陶县| 仁怀市| 元氏县| 东丰县| 文登市| 嘉定区| 海盐县| 凭祥市| 越西县| 洪湖市| 东源县| 蕉岭县| 诸暨市| 井陉县| 碌曲县| 灵宝市| 莱西市| 卫辉市| 长治市| 开阳县| 商水县| 洮南市| 洪雅县| 凤阳县| 报价| 新蔡县| 安康市| 紫金县| 乌什县| 泗洪县| 桓仁| 东丰县|