首页 > 其他分享 >js设计模式之命令模式

js设计模式之命令模式

时间:2024-01-21 23:22:26浏览次数:28  
标签:菜单 模式 js 命令 let receiver new 设计模式 class

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>命令模式</title>
</head>
<body>
<button id="btn1">刷新菜单</button>
<button id="btn2">增加菜单</button>
<button id="btn3">删除菜单</button>
<script>
/**
* 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;
* 对请求排队或者记录请求日志,以及执行可撤销的操作。也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。
* 此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。
*/
//定义一个命令发布者(执行类)
class Executor {
setCommand(btn, command) {
btn.onclick = function () {
command.execute();
}
}
}

//定义一个命令接受者
class Menu {
refresh() {
console.log('刷新菜单');
}

addMenu() {
console.log('添加菜单');
}
deleteMenu() {
console.log('删除菜单');
}
}

//刷新菜单命令对象
class RefreshMenu {
constructor(receiver) {
this.receiver = receiver;
}
//爆漏出统一的接口
execute(){
this.receiver.refresh();
}
}
//增加菜单
class AddMenu {
constructor(receiver) {
this.receiver = receiver;
}
//爆漏出统一的接口
execute(){
this.receiver.addMenu();
}
}
//删除菜单
class DeleteMenu {
constructor(receiver) {
this.receiver = receiver;
}
execute(){
this.receiver.deleteMenu();
}
}
const menu = new Menu();
const executor = new Executor();
//刷新菜单
const refreshMenu = new RefreshMenu(menu);
//给按钮添加刷新操作
let ben1=document.getElementById('btn1');
executor.setCommand(ben1, refreshMenu);
//给按钮2添加增加菜单操作
let addMenu=new AddMenu(menu);
let ben2=document.getElementById('btn2');
executor.setCommand(ben2, addMenu);
//删除菜单
let deleteMenu=new DeleteMenu(menu);
let ben3=document.getElementById('btn3');
executor.setCommand(ben3, deleteMenu);
</script>
</body>
</html>

标签:菜单,模式,js,命令,let,receiver,new,设计模式,class
From: https://www.cnblogs.com/itzhijia/p/17978691

相关文章

  • keil的调试模式debug
    (1)工程选项,debug这里可以对调试选项进行配置(2)左边的是使用仿真器,右边是默认的在硬件上在线仿真(3)编译一下工程确保没有问题(4)然后点击这里的放大镜里面带各地的图标,进入调试模式(5)主窗口是我们C语言程序,上面的窗口就是C语言翻译成的汇编程序,然后左边这个窗口是寄存器组和状态标志......
  • 懒汉单例模式
    1publicclassSingleInstance{2/**3*懒汉单例模式:当真正需要该对象的时候,才去创建一个对象(延迟加载对象)4*1.定义一个类,把构造器私有5*2.定义一个静态变量存储一个对象6*3.提供一个返回单例对象的方法7*/8//......
  • Seata 2.x 首个版本正式发布,支持 Raft 集群模式
    作者:Seata社区用户登记欢迎已使用用户在此链接登记,便于我们更好的针对业务场景优化:https://github.com/seata/seata/issues/12462.x Roadmap发布概览2.0.0中对大家期待已久的Raft集群模式做了支持,Raft集群模式消除了对第三方注册中心和Seata-Server后端存储的依赖,......
  • 饿汉单例模式示例
    1publicclassSingleInstance{2/*3饿汉单例模式:在用类创建对象的时候,对象就已经准备好了41.定义一个类,把构造器私有52.定义一个静态变量存储一个对象6*/7publicstaticSingleInstanceinstance=newSingl......
  • 代理模式
    定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介作用类型:结构型适用场景:保护目标对象增强目标对象优点:代理模式能将代理对象与真实被调用的目标对象分离一定程度上降低了系统的耦合度,扩展性好保护目标......
  • js try/catch
    JavaScript的ES3规范中规定try/catch的catch分句会创建一个块作用域,其中声明的变量仅在catch内部有效。例如:try{undefined();//执行一个非法操作来强制制造一个异常}catch(err){console.log(err);//能够正常执行!}console.log(err);//Referenc......
  • js 块作用域
    (functionIIFE(def){def(window);})(functiondef(global){vara=3;console.log(a);//3console.log(global.a);//2});函数表达式def定义在片段的第二部分,然后当作参数(这个参数也叫作def)被传递进IIFE函数定义的第一部分中。最后,参数def(也就是传递......
  • js 立即执行函数表达式
    如果没有函数名,当函数需要引用自身时只能使用已经过期的arguments.callee引用,比如在递归中。另一个函数需要引用自身的例子,是在事件触发后事件监听器需要解绑自身。匿名函数省略了对于代码可读性/可理解性很重要的函数名。一个描述性的名称可以让代码不言自明。行内函数表达式......
  • js 函数作用域
    在任意代码片段外部添加包装函数,可以将内部的变量和函数定义“隐藏”起来,外部作用域无法访问包装函数内部的任何内容。例如:vara=2;functionfoo(){//<--添加这一行vara=3;console.log(a);//3}//<--以及这一行foo();//<--以及这一行console.log(......
  • js 规避冲突
    隐藏”作用域中的变量和函数所带来的另一个好处,是可以避免同名标识符之间的冲突,两个标识符可能具有相同的名字但用途却不一样,无意间可能造成命名冲突。冲突会导致变量的值被意外覆盖。例如:functionfoo(){functionbar(a){i=3;//修改for循环所属作用域中的i......