JavaScript设计模式笔记(五)命令模式

本文深入探讨了软件设计中的命令模式,通过实例展示了如何在JavaScript中应用命令模式,包括基本命令和宏命令,阐述了其优点和缺点。

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

命令模式定义

命令指一个执行某件特定事件的指令,命令模式将发起命令者和执行命令者分离。对两者进行了松耦合的处理,体现了开放-封闭原则。

JavaScript中的命令模式

假如一个公司的boss每天要命令公司某个员工去跑腿帮他拿报纸,不知道每天会叫哪一个员工,此时我们使用命令模式来将这个关系松耦合。在这个过程中,boss只需知道谁去跑腿,而不用关心怎么跑腿。

let boss = {
    getNewspaper: function(staff) {
        console.log(`命令${staff.name}拿报纸`)
    }
}

let setCommend = function(staff, work) {
    work(staff);
}

let getNewspaperCommend = function(commender) {
    return commender.getNewspaper;
}

let staff1 = {
    name: 'xiaoming'
}

let staff2 = {
    name: 'xiaohong'
}

setCommend(staff1, getNewspaperCommend(boss)); // 命令xiaoming拿报纸

setCommend(staff2, getNewspaperCommend(boss)); // 命令xiaohong拿报纸

这里如果我们需要添加新的命令,可以直接添加一个新命令,并将该命令指向某个人去执行,不用修改之前的代码,而命令的执行也与命令接收者状态无关。

宏命令

宏命令是一组命令的集合,将几个有相关性的命令结合起来同时发出,减少了发起命令的次数

我们做另一个假设,现在天气很热,老板让办公室的人开空调,这个人需要做关门,关窗,使用遥控器打开空调几个操作,我们将这几个命令和起来作为一个宏命令。

let boss = {
    closeDoor: function(staff) {
        console.log(`${staff.name}关门`)
    },
    closeWindow: function(staff) {
        console.log(`${staff.name}关窗`)
    },
    openAircondition: function(staff) {
        console.log(`${staff.name}打开空调`)
    }
}

let setCommend = function(staff, work) {
    work(staff);
}

let closeDoorCommend = function(commender) {
    return commender.closeDoor;
}

let closeWindowCommend = function(commender) {
    return commender.closeWindow;
}

let openAirconditionCommend = function(commender) {
    return commender.openAircondition;
}

let MacrosCommand = function() {
    return {
        commandsList: [],
        add: function(command) {
            this.commandsList.push(command)
        },
        execute: function(staff) {
            for (let i = 0, command; i < this.commandsList.length;) {
                setCommend(staff, this.commandsList[i++])
            }
        }
    }
}

let staff1 = {
    name: "xiaoming"
}

let macrosCommand = MacrosCommand();

macrosCommand.add(closeDoorCommend(boss))
macrosCommand.add(closeWindowCommend(boss))
macrosCommand.add(openAirconditionCommend(boss))

macrosCommand.execute(staff1)

 

命令模式的优点

使命令发起者和命令接收者松耦合,在编写代码时编写命令发起者和命令接收者可以分给不同的人编写,且不会相互影响,符合开放-闭合原则。

命令模式的缺点

相对于直接绑定命令发起者和命令接收者,代码量增加了,每种命令都要对应有一个方法来指定发起者中的哪一个命令。


参考自曾探的《JavaScript设计模式与开发实践》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值