JavaScript设计模式_07_组合模式

组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。并通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性。

/**
 * pre:组合模式
 */
//--------- 示例1 ---------
/* 更强大的宏命令
 */
var MarcoCmd = function() {
    var cmdList = [],
        add, execute;
    add = function(obj) {
        cmdList.push(obj);
    };
    execute = function() {
        if(!cmdList.length == 0) {
            for(var obj of cmdList) {
                obj.execute.apply(this);
            }
        }
    };
    return {
        add: add,
        execute: execute
    }
};
//第一组命令
var openDoorCmd = {
    execute: function() {
        console.log("开门.");
    }
};
var openPcCmd = {
    execute: function() {
        console.log("开电脑.");
    }
};
var loginQQCmd = {
    execute: function() {
        console.log("登录QQ.");
    }
};
var marcoCmd1 = MarcoCmd();
marcoCmd1.add(openDoorCmd);
marcoCmd1.add(openPcCmd);
marcoCmd1.add(loginQQCmd);
//第二组命令
var openAcCmd = {
    execute: function() {
        console.log("打开空调.");
    }
};
var openTvCmd = {
    execute: function() {
        console.log("打开电视.");
    }
};
var openSoundCmd = {
    execute: function() {
        console.log("打开音箱.");
    }
};
var marcoCmd2 = MarcoCmd();
marcoCmd2.add(openTvCmd);
marcoCmd2.add(openSoundCmd);

// 组合命令
var marcoCmd = MarcoCmd();
marcoCmd.add(openAcCmd);
marcoCmd.add(marcoCmd1);
marcoCmd.add(marcoCmd2);

var setCommand = (function(command) {
    document.getElementById("controlBtn").onclick = function() {
        command.execute.apply(this);
    }
})(marcoCmd);

/*[注]:组合命令模式可以让客户不再顾忌节点是组合对象还是叶子对象,只要都拥有相同的execute方法 即可。
 * 但需要注意的是:
 *     1、组合模式不是父子关系,它们合作的关键是拥有相同的接口;
 *     2、除了有相同的接口,对一组叶子对象的操作要具有一致性;
 *     3、当一个叶子节点属于多个组的时候,相互引用比较复杂不适合组合模式,可使用中介者模式;
 */

 

posted @ 2017-06-19 17:10  Stinchan  阅读(193)  评论(0编辑  收藏  举报