zoukankan      html  css  js  c++  java
  • js 命令模式 组合模式

    * 基本宏命令

    var closeDoorCommand = {
    	execute: function() {
    		console.log("Closing the door...");
    	}
    };
    var openPcCommand = {
    	execute: function() {
    		console.log("Opening the PC...");
    	}
    };
    var launchQQCommand = {
    	execute: function() {
    		console.log("launching QQ...");
    	}
    };
    
    var MacroCommand = function() {
    	return {
    		commandsList: [],
    		add: function(command) {
    			this.commandsList.push(command);
    		},
    		execute: function() {
    			for (var i = 0, command; command = this.commandsList[i]; i++) {
    				command.execute();
    			}
    		}
    	}
    };
    
    var macroCommand = MacroCommand();
    
    macroCommand.add(closeDoorCommand);
    macroCommand.add(openPcCommand);
    macroCommand.add(launchQQCommand);
    
    macroCommand.execute();
    // Closing the door...
    // Opening the PC...
    // launching QQ...
    

      

    * 树形宏命令

    <html>
    
    <head>
        <meta charset="UTF-8">
        <title>macro command</title>
    </head>
    
    <body>
        <button id="button">Press me</button>
        <script>
        var MacroCommand = function() {
            return {
                commandsList: [],
                add: function(command) {
                    this.commandsList.push(command);
                },
                execute: function() {
                    for (var i = 0, command; command = this.commandsList[i]; i++) {
                        command.execute();
                    }
                }
            }
        };
        // 打开空调
        var openAcCommand = {
            execute: function() {
                console.log("Opening the Air conditioner...");
            }
        };
        // 打开电视和音响
        var openTvCommand = {
            execute: function() {
                console.log("Opening the TV...");
            },
            add: function() {
            	throw new Error('Cannot add child node to leaf object');
            }
        };
        var openStereoCommand = {
            execute: function() {
                console.log("Opening the stereo...");
            }
        };
        var macroCommand1 = MacroCommand();
    
        macroCommand1.add(openTvCommand);
        macroCommand1.add(openStereoCommand);
    
        // 关门、开电脑、登陆qq
        var closeDoorCommand = {
            execute: function() {
                console.log("Closing the door...");
            }
        };
        var openPcCommand = {
            execute: function() {
                console.log("Opening the PC...");
            }
        };
        var launchQQCommand = {
            execute: function() {
                console.log("launching QQ...");
            }
        };
        var macroCommand2 = MacroCommand();
    
        macroCommand2.add(closeDoorCommand);
        macroCommand2.add(openPcCommand);
        macroCommand2.add(launchQQCommand);
    
        // 现在把所有的命令组合成一个超级命令
        var macroCommand = MacroCommand();
        macroCommand.add(openAcCommand);
        macroCommand.add(macroCommand1);
        macroCommand.add(macroCommand2);
    
        // 绑定到遥控器
        var setCommand = (function(command) {
            document.getElementById("button").onclick = function() {
                command.execute();
            }
        })(macroCommand);
    
        // openTvCommand.add(macroCommand);  // Uncaught Error: 
        </script>
    </body>
    
    </html>
    

      

      

    运行结果:

    * 扫描文件夹

    /********** Folder **************/
    function Folder(name) {
        this.name = name;
        this.files = [];
    }
     
    Folder.prototype.add = function(file) {
        this.files.push(file);
    }
     
    Folder.prototype.scan = function() {
        console.log("开始扫描文件夹: " +this.name);
        for (var i = 0, file, files = this.files; file = files[i]; i++) {
            file.scan();
        }
    }
     
    /********** File **************/
    function File(name) {
        this.name = name;
    }
     
    File.prototype.add = function() {
        throw new Error("文件下面不能再添加文件");
    }
     
    File.prototype.scan = function() {
        console.log("开始扫描文件: " +this.name);
    }
     
    var folder = new Folder('学习资料');
    var folder1 = new Folder('javascript');
    var folder2 = new Folder('jQuery');
     
    var file1 = new File('javascript设计模式与开发实践');
    var file2 = new File('精通jQuery');
    var file3 = new File('重构与模式');
     
    folder1.add(file1);
    folder2.add(file2);
     
    folder.add(folder1);
    folder.add(folder2);
    folder.add(file3);
     
    var folder3 = new Folder('Nodejs');
    var file4 = new File('深入浅出Node.js');
    folder3.add(file4);
     
    var file5 = new File('javascript语言精髓与编程实践');
    folder.add(folder3);
    folder.add(file5);
     
    folder.scan();
    /*
    开始扫描文件夹: 学习资料
    开始扫描文件夹: javascript
    开始扫描文件: javascript设计模式与开发实践
    开始扫描文件夹: jQuery
    开始扫描文件: 精通jQuery
    开始扫描文件: 重构与模式
    开始扫描文件夹: Nodejs
    开始扫描文件: 深入浅出Node.js
    开始扫描文件: javascript语言精髓与编程实践
    */
    

      

     * 引用父对象

    /********** Folder **************/
    function Folder(name) {
        this.name = name;
        this.parent = null;  // add attribute this.parent
        this.files = [];
    }
     
    Folder.prototype.add = function(file) {
        file.parent = this;  // set parent object
        this.files.push(file);
    }
     
    Folder.prototype.scan = function() {
        console.log("开始扫描文件夹: " +this.name);
        for (var i = 0, file, files = this.files; file = files[i]; i++) {
            file.scan();
        }
    }
    
    Folder.prototype.remove = function() {
        if (!this.parent) { // root node or free node
            return;
        }
        for (var files = this.parent.files, i = files.length -1; 0 <= i; i--) {
            var file = files[i];
            if (file === this) {
                files.splice(i, 1);
            }
        }
    }
     
    /********** File **************/
    function File(name) {
        this.name = name;
    }
     
    File.prototype.add = function() {
        throw new Error("文件下面不能再添加文件");
    }
     
    File.prototype.scan = function() {
        console.log("开始扫描文件: " +this.name);
    }
    
    File.prototype.remove = function() {
        if (!this.parent) { // root node or free node
            return;
        }
        for (var files = this.parent.files, i = files.length -1; 0 <= i; i--) {
            var file = files[i];
            if (file === this) {
                files.splice(i, 1);
            }
        }
    }
     
    var folder = new Folder('学习资料');
    var folder1 = new Folder('javascript');
     
    var file1 = new File('深入浅出Node.js');
     
    folder1.add(new File('javascript语言精髓与编程实践'));
    folder.add(folder1);
    folder.add(file1);
    
    folder1.remove();
    folder.scan();
     
    

      

      

  • 相关阅读:
    html5 geolocation配合百度地图api实现定位
    ES6 Symbol
    es2018(es9)前瞻
    Vue探索历程(一)
    数独游戏的难度等级分析及求解算法研究1——关于数独
    关于谋生的一些想法
    加密的pdf转换为jpg
    数独游戏的难度等级分析及求解算法研究2——数独难度等级
    NSString NSData char* NSInteger的转换
    根据文字多少自动设置UILabel的宽度高度
  • 原文地址:https://www.cnblogs.com/mingzhanghui/p/9282729.html
Copyright © 2011-2022 走看看