当前位置: 首页 > news >正文

JS 设计模式五 -- 命令模式

概念

命令模式中的命令(command) 指的是 一个执行某些待定事情的指令。

用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。

 

例子

假设html结构如下:
<button id="button1">刷新菜单目录</button>
<button id="button2">增加子菜单</button>
var setCommand = function(button,func) {
    button.onclick = function(){
        func();
    }
 }; 
 var MenuBar = {
    refersh: function(){
        alert("刷新菜单界面");
    }
 };
 var SubMenu = {
    add: function(){
        alert("增加菜单");
    }
 };
 // 刷新菜单
 var RefreshMenuBarCommand = function(receiver) {
    return function(){
        receiver.refersh();    
    };
 };
 // 增加菜单
 var AddSubMenuCommand = function(receiver) {
    return function(){
        receiver.add();    
    };
 };
// 刷新菜单 var refershMenuBarCommand = RefreshMenuBarCommand(MenuBar); // 增加菜单 var addSubMenuCommand = AddSubMenuCommand(SubMenu); setCommand(b1,refershMenuBarCommand); setCommand(b2,addSubMenuCommand);

 

理解宏命令

宏命令是一组命令的集合,通过执行宏命令的方式,可以一次执行一批命令。

这样类似把页面的所有函数方法放在一个数组里面去,然后遍历这个数组,依次执行该方法。

 

例子

var command1 = {
    execute: function(){
        console.log(1);
    }
}; 
var command2 = {
    execute: function(){
        console.log(2);
    }
};
var command3 = {
    execute: function(){
        console.log(3);
    }
};
// 定义宏命令,command.add方法把子命令添加进宏命令对象,
// 当调用宏命令对象的execute方法时,会迭代这一组命令对象,
// 并且依次执行他们的execute方法。
var command = function(){
    return {
        commandsList: [],
        add: function(command){
            this.commandsList.push(command);
        },
        execute: function(){
            for(var i = 0,commands = this.commandsList.length; i < commands; i+=1) {
                this.commandsList[i].execute();
            }
        }
    }
};
// 初始化宏命令
var c = command();
c.add(command1);
c.add(command2);
c.add(command3);
c.execute();  // 1,2,3

 

转载于:https://www.cnblogs.com/gaosirs/p/10749367.html

相关文章:

  • CommandBuffer实现Distort屏幕扭曲效果
  • Anti-aliasing and Continuity with Trapezoidal Shadow Maps
  • tarjan----强连通分量
  • Trapezoidal Shadow Maps (TSM) - Recipe
  • 十天冲刺-03
  • Perspective Shadow Maps: Care and Feeding
  • 网络基础 08_NAT
  • C# AttributeUsage
  • vue组件之间的传值方式
  • C# Attribute
  • linux 网络虚拟化: network namespace 简介
  • TBDR
  • CBFR和CBDR
  • Ajax 的学习
  • Unity2019使用Gradle打包Apk的问题
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android框架之Volley
  • js递归,无限分级树形折叠菜单
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux快速复制或删除大量小文件
  • Quartz初级教程
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 闭包,sync使用细节
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 服务器之间,相同帐号,实现免密钥登录
  • 规范化安全开发 KOA 手脚架
  • 利用DataURL技术在网页上显示图片
  • 深度解析利用ES6进行Promise封装总结
  • 使用 Docker 部署 Spring Boot项目
  • 项目实战-Api的解决方案
  • 1.Ext JS 建立web开发工程
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​用户画像从0到100的构建思路
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (Java)【深基9.例1】选举学生会
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转载)OpenStack Hacker养成指南
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • ::前边啥也没有
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ IO.File ] FileSystemWatcher
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [Godot] 3D拾取
  • [leetcode 189][轮转数组]