JS設計模式初識(七)-組合模式

定義

組合模式就是用小的子對象來構建更大的對象,而這些小的子對象自己也許是由更 小的「孫對象」構成的。javascript

7.1 組合實例 -掃描文件夾

//文件夾類
function Folder(name) {
    this.name = name;
    this.files = [];
    this.parent = null;
}
Folder.prototype.add = function(file) {
    file.parent = this;
    this.files.push(file);
    
}
Folder.prototype.scan = function() {
    console.log('開始掃描文件夾 => ',this.name);
    for (let i=0; i<this.files.length; i++) {
        const file = this.files[i];
        file.scan();
    }
}
Folder.prototype.remove = function(file) {
    if (!this.parent) {
        return false;
    }
    const files = this.files;
    const len = files.length;
    for (let i=files[len]; i >= 0; i--) {
        if (files[i] === file) {
            files.splice(i,1);
        }
    }
}
// 文件類
function File(name) {
    this.name = name;
    this.parent = null;
}
File.prototype.add = function() {
    throw new Error('file下面不能添加文件');
}
File.prototype.scan = function() {
    console.log('開始掃描文件 => ',this.name);
}
File.prototype.remove = function() {
    if (!this.parent) {
        return false;
    }
    const files = this.files;
    const len = files.length;
    for (let i=files[len-1]; i >= 0; i--) {
        if (files[i] === file) {
            files.splice(i,1);
        }
    }
}

const Ftimo = new Folder('Ftimo');
const Ffe = new Folder('Ffe');
const Fjs = new Folder('Fjs');
const Fes6 = new Folder('Fes6');
const Freact = new Folder('Freact');
const Fredux = new Folder('Fredux');
const findex = new File('findex');
const fcss = new File('fcss');
const fless = new File('fless');
const fjavascript = new File('fjavascript');
const fjava = new File('fjava');
Ftimo.add(Ffe);
Ffe.add(Fjs);
Ffe.add(Fes6);
Fjs.add(findex);
Fjs.add(fcss);
Fjs.add(fless);
Ffe.add(fjavascript);
Ffe.add(fjava);
Fjs.add(Freact);
Fjs.add(Fredux);
Ftimo.scan();
複製代碼

7.2 優化代碼

複製代碼

7.3 注意點

  • 組合模式不是父子關係, 只是父子節點關係
  • 對葉對象操做的一致性
  • 雙向映射關係
  • 用職責鏈模式提升組合模式性能

7.4 什麼時候候使用組合模式

  1. 表示對象的部分總體層次結構。組合模式能夠方便地構造一棵樹來表示對象的部分總體結構。特別是咱們在開發期間不肯定這棵樹到底存在多少層次的時候。在樹的構造最 終完成以後,只須要經過請求樹的最頂層對象,便能對整棵樹作統一的操做。
  2. 客戶但願統一對待樹中的全部對象。組合模式使客戶能夠忽略組合對象和葉對象的區別, 客戶在面對這棵樹的時候,不用關心當前正在處理的對象是組合對象仍是葉對象,也就 不用寫一堆 if、else語句來分別處理它們。組合對象和葉對象會各自作本身正確的事情, 這是組合模式最重要的能力。

7.5 總結

  1. 組合模式可讓咱們使用樹形方式建立對象的結構。咱們能夠把相同的操做應用在組合對象和單個對象上。在大多數狀況下,咱們均可以忽略掉組合對象和單個對象之間的差異,從而用一致的方式來處理它們。
  2. 若是經過組合模式建立了太多的對象,那麼這些對象可能會讓系統負擔不起。
相關文章
相關標籤/搜索