javascript設計模式學習筆記之組合模式

組合模式

  • 組合模式是將對象組合成樹形結構, 以表示 "部分-總體" 的層次結構, 再者, 利用對象的多態性統一對待組合對象和單個對象
  • 注意點:javascript

    • 組合模式不是父子關係
    • 對葉對象操做的一致性
    • 雙向映射關係
    • 利用職責鏈模式提升組合模式性能
  • 應用場景java

    • 表示對象的部分-總體層次結構
    • 客戶但願統一對待樹中的全部對象
  • 舉例: 掃描文件夾性能

    /* * * * * * 文件夾(Folder) * * * * * * */
    var Folder = function(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);
        var i = 0,
            len = this.files.length,
            file;
        
        for(; i < len; i++) {
            file = this.files[i];
            file.scan();
        }
    }
    
    Folder.prototype.remove = function() {
        if (!this.parent) {
            return;
        }
        var i = this.parent.files.length - 1,
            files = this.parent.files,
            file;
    
        for(; i >= 0; i--) {
            file = files[i];
            if (file === this) {
                files.splice(i, 1);
            }
        }
    }
    
    /* * * * * * 文件(File) * * * * * * */
    var File = function(name) {
        this.name = name;
        this.parent = null;
    }
    
    File.prototype.add = function() {
        throw new Error('文件下面不能再添加文件');
    }
    
    File.prototype.scan = function() {
        console.log('開始掃描文件:' + this.name);
    }
    
    File.prototype.remove = function() {
        if (!this.parent) {
            return;
        }
        var i = this.parent.files.length - 1,
            files = this.parent.files,
            file;
    
        for(; i >= 0; i--) {
            file = files[i];
            if (file === this) {
                files.splice(i, 1);
            }
        }
    }
相關文章
相關標籤/搜索