设计模式之命令模式

本文深入探讨了JavaScript中的命令模式,包括传统命令模式的应用、撤销和重做的实现,以及宏命令的概念。通过具体实例,展示了如何在JavaScript中实现命令模式的不同应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令模式主要是处理解决命令和执行的解耦,如果不显性的显性的独立一个命令安装对象,将和策略模式无法区分


目录:

1.传统命令模式

2.javascript中的命令模式

3.撤销和重做

4.宏命令


传统命令模式:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<button id="button1">点击按钮1</button>
<button id="button2">点击按钮1</button>
<button id="button3">点击按钮1</button>
<script>
    function $(id){
        return document.getElementById(id);
    }
    var btn1=$("button1");
    var btn2=$("button2");
    var btn3=$("button3");
    //设置命令
    var setCommand=function(button,command){
        button.onclick=function(){
            command.execute();
        }
    };
    //设置命令
    var MenuBar={
        refresh:function(){
            console.log("刷新菜单目录")
        }
    };
    var subMen={
        add:function(){
            console.log("增加子菜单")
        },
    del:function(){
        console.log("删除子菜单")
    }
    };
//在让button有用前,我们先要把这些行为都分钟到命令类中
    var RefreshMenuBarCommad=function(receiver){
        this.receiver=receiver;
    };
    RefreshMenuBarCommad.prototype.execute=function(){
        this.receiver.refresh();
    };
    var AddsubMenuCommand=function(receiver){
        this.receiver=receiver;
    };
    AddsubMenuCommand.prototype.execute=function(){
        this.receiver.add();
    };
    var DelSubMenuCommand=function(receiver){
        this.receiver=receiver;
    };
    DelSubMenuCommand.prototype.execute=function(){
       console.log("删除子菜单")
    };
//最后吧命令接受者传入草command对象中,并且把command对象安装到button上面
    var refreshMenuBarCommand=new RefreshMenuBarCommad(MenuBar);
    var addSubMenuCommand=new AddsubMenuCommand(subMen);
    var delSubMenuCommand=new DelSubMenuCommand(subMen);

    setCommand(btn1,refreshMenuBarCommand);
    setCommand(btn2,addSubMenuCommand);
    setCommand(btn3,delSubMenuCommand)
</script>
</body>
</html>

javascript的命令模式:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<button id="button1">点击按钮1</button>
<button id="button2">点击按钮1</button>
<button id="button3">点击按钮1</button>
<script>
    function $(id){
        return document.getElementById(id);
    }
    var btn1=$("button1");
    var btn2=$("button2");
    var btn3=$("button3");
    //设置命令
    var setCommand=function(button,command){
        button.onclick=function(){
            command.execute();
        }
    };
    //设置命令
    var MenuBar={
        refresh:function(){
            console.log("刷新菜单目录")
        }
    };
    //在让button有用前,我们先要把这些行为都分钟到命令类中,将来可能需要提供撤销功能所以吧执行函数改为execute
    var RefreshMenuBarCommad=function(receiver){
        return{
            execute:function(){
                receiver.refresh();
            }
        }
    };


    var refreshMenuBarCommand=RefreshMenuBarCommad(MenuBar);
    setCommand(btn1,refreshMenuBarCommand);

    </script>
</body>
</html>

撤销命令和重做:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<button id="replay">播放录像</button>
<script>
    var Ryu={
        attach:function(){
            console.log("攻击");
        },
        defense:function(){
            console.log("防御")
        },
        jump:function(){
            console.log("跳动")

        },
        crouch:function(){
            console.log("蹲下")
        }
    };
    //创建命令
    var makeCommand=function(receiver,state){
        return function(){
            receiver[state]();
        }
    };
    var commands={
      "119":"jump",//w
        "115":'crouch',//s
        "97":"defense",//a
        "100":"attach"//d
    };
    var commandStachk=[];//保存命令的堆栈
    document.onkeypress=function(ev){
        var keyCode=ev.keyCode;
        var command=makeCommand(Ryu,commands[keyCode]);
        if(command){
            command();//执行命令
            commandStachk.push(command);//将刚刚执行过的命令保存到堆 栈中
        }
    };
    document.getElementById("replay").onclick=function(){
        var command;
        while(command=commandStachk.shift()){
            command();
        }
    }
</script>
</body>
</html>

宏命令[将无法看出是命令模式]:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    var closeDoorCommand={
        execute:function(){
            console.log("关门")
        }
    };
    var openPcCommand={
        execute:function(){
            console.log("开电脑")
        }
    };
    var openQQCommand={
        execute:function(){
            console.log("登录QQ")
        }
    };
    //添加命令,并执行多个命令
    var MacroCommand=function() {
        return {
            commandsList: [],
            add: function (command) {
                this.commandsList.push(command)
            },
            execute: function () {
                for (var i = 0, command; command = this.commandsList[i++];) {
                    command.execute();
                }
            }
        }
    };

    var macroCommands=MacroCommand();//创建命令对象
    //添加命令
    macroCommands.add(closeDoorCommand);
    macroCommands.add(openPcCommand);
    macroCommands.add(openQQCommand);
    //执行命令
    macroCommands.execute();
</script>
</body>
</html>

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆康永

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值