javascriptデザインモード学習ノートの組み合わせモード


コンビネーションモード
  • 合成モードは、オブジェクトをツリー構造に結合し、「部分−全体」を表す階層構造であり、さらに、オブジェクトの多状態性を利用して、合成オブジェクトと単一のオブジェクトを一括して扱う
  • である.
  • 注意点:
  • グループモードは親子関係ではありません.
  • のリーフオブジェクト動作の一貫性
  • 双方向マッピング関係
  • .職責チェーンパターンを利用して、合成モード性能を向上させる
  • .
  • アプリケーションシーン
  • は、オブジェクトの部分を表しています.全体的な階層構造
  • お客様はツリー内のすべてのオブジェクトに対して統一したいです.
  • 例:スキャンフォルダ
    /* * * * * *    (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);
            }
        }
    }