我学会了,命令模式

简介: 命令模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

前言

命令模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

命令模式

使用场景:将命令进行存储,在需要的时候再去调用。比如请求的封装,需要的时候再去调用这个命令。这种模式是为了将行为的执行延迟了,将 执行类的对象封装到命令类中,执行类对象的行为就会作为命令类的一个行为,当需要调用时,再将命令传给调用类的对象,调用类的对象直接调用该命令类的对象的这个行为即可。

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。这个模式其实非常的简单,也就是将要执行的行为封装为一个命令,这个命令可以传给调用者,调用者可以选择在合适的时候去调用。之所以看起来那么复杂,其实是那层概念难以理解,比如 将执行者和调用者解耦。执行者和调用者的含义相似,但是可以将执行者定义为厨师,而调用者可以定义为顾客,而命令可以理解为做麻辣小龙虾。顾客不是直接找厨师做麻小,而是通过菜单点菜,厨师看到菜单就会去做,做好了顾客直接吃就行了。

namespace action_mode_09 {
    
    // 炒菜命令的接口
    interface IStirFryCommand {

        stirFry (): string
    }

    // 执行类:五星厨师
    class FiveStarChef {

        // 做一份麻辣小龙虾
        stirFrySpicyCrayfish () {
            const reuslt = '一盘麻辣小龙虾!!!!!'
            console.log('五星厨师在线做菜,来喽一盘' + reuslt)
            return reuslt
        }

        // 做一份红烧东坡肉
        stirFryBraisedDongpoMeat () {
            const reuslt = '一盘红烧东坡肉!!!!!'
            console.log('五星厨师在线做菜,来喽一盘' + reuslt)
            return reuslt
        }
    }

    // 命令类:做一份麻辣小龙虾
    class SpicyCrayfish implements IStirFryCommand {

        fiveStarChef: FiveStarChef

        constructor (fiveStarChef: FiveStarChef) {
            this.fiveStarChef = fiveStarChef
            console.log('命令:做一份麻辣小龙虾')
        }

        stirFry(): string {
            console.log('执行命令:做一份麻辣小龙虾')
            return this.fiveStarChef.stirFrySpicyCrayfish()
        }
    }

    // 命令类:做一份红烧东坡肉
    class BraisedDongpoMeat implements IStirFryCommand {
        
        fiveStarChef: FiveStarChef

        constructor (fiveStarChef: FiveStarChef) {
            this.fiveStarChef = fiveStarChef
            console.log('命令:做一份红烧东坡肉')
        }

        stirFry(): string {
            console.log('执行命令:做一份红烧东坡肉')
            return this.fiveStarChef.stirFryBraisedDongpoMeat()
        }
    }

    // 调用类:VIP客户
    class VIPCustomes {

        private mealList: Array<IStirFryCommand> = new Array()

        // 点菜
        addOrder(orderCmd: IStirFryCommand) {
            this.mealList.push(orderCmd)
        }

        // 吃菜
        eat () {
            
            if (!this.mealList.length) {
                return
            }

            while(this.mealList.length) {
                const meal = this.mealList.splice(0, 1)[0]
                const result = meal.stirFry()
                console.log('吃:' + result)
            }

            console.log('都吃完了!!!!!')
        }
    }
  

    const fiveStarChef = new FiveStarChef()
    const spicyCrayfish = new SpicyCrayfish(fiveStarChef)
    const braisedDongpoMeat = new BraisedDongpoMeat(fiveStarChef)

    const vipCustomes = new VIPCustomes()
    // 没点菜,直接吃
    vipCustomes.eat()

    // 点两单
    vipCustomes.addOrder(spicyCrayfish)
    vipCustomes.addOrder(braisedDongpoMeat)
    // 吃
    vipCustomes.eat()

    // 点两单
    vipCustomes.addOrder(braisedDongpoMeat)
    vipCustomes.addOrder(spicyCrayfish)
    // 吃
    vipCustomes.eat()

}
目录
相关文章
|
Python
python pyinstaller “Cannot find the MXNet library“ libmxnet.dll #文件包缺失
python pyinstaller “Cannot find the MXNet library“ libmxnet.dll #文件包缺失
252 0
|
7月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
设计模式 存储 Go
|
JavaScript Java 测试技术
基于微信小程序的课堂点名系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的课堂点名系统的设计与实现(源码+lw+部署文档+讲解等)
229 0
|
网络协议 NoSQL Linux
知识巩固源码落实之6:c语言拼接字符串与切割字符串(strsep)代码
知识巩固源码落实之6:c语言拼接字符串与切割字符串(strsep)代码
177 0
|
缓存 安全 JavaScript
Deno 命令行界面
Deno 命令行界面
|
数据采集 传感器 算法
转:FFT算法在局域网管理软件中的应用与实现
当谈及FFT(快速傅里叶变换)时,我们实际上在探讨一种神奇的数学算法,它能够将信号从一种时间上的视角变幻到一种频率上的视角。这个算法在数字信号处理、图像处理和通信等多个领域都展现了其神奇的用途。然而,要在局域网管理软件中直接拿来使用FFT,似乎有些少见,这是因为FFT主要在信号处理和数学计算的范畴扬威,与网络管理貌似关系并不直接。
119 0
|
搜索推荐 程序员
浅析源码分析的动机
浅析源码分析的动机
164 0
|
自然语言处理 算法 Java
自然语言处理hanlp------6-2字典树的实现
自然语言处理hanlp------6-2字典树的实现
自然语言处理hanlp------6-2字典树的实现
|
算法 Python
【蓝桥杯考前一天总结PYthon终结篇】
【蓝桥杯考前一天总结PYthon终结篇】
286 0
【蓝桥杯考前一天总结PYthon终结篇】