aiyoudiao aiyoudiao
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档

码二

扫微信二维码,认识一下码二吧😉。
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档
  • LeetCode

  • 算法

  • 数据结构

  • 设计模式

    • 浅聊设计理念
    • 谈一谈设计原则
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
    • 单例模式
    • 桥接模式
    • 代理模式
    • 装饰器模式
    • 适配器模式
    • 享元模式
    • 组合模式
    • 外观模式
    • 观察者模式
    • 模板方法模式
    • 策略模式
    • 职责链模式
    • 状态模式
    • 迭代器模式
    • 访问者模式
    • 备忘录模式
    • 命令模式
      • 前言
      • 命令模式
    • 解释器模式
    • 中介者模式
  • Other

  • vue3设计与实现

  • 算法与设计
  • 设计模式
aiyoudiao
2022-02-25

命令模式

# 前言

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

# 命令模式

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

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

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()

}
#设计模式
上次更新时间: 10年18月2023日 01时57分53秒
备忘录模式
解释器模式

← 备忘录模式 解释器模式 →

最近更新
01
01.数据结构导论一览.md
10-16
02
30.2023年06月04日.md
06-04
03
08.与测量相关.md
05-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 aiyoudiao 码二 备案号: 鄂ICP备2022002654号-1