前言
命令模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
命令模式
使用场景:将命令进行存储,在需要的时候再去调用。比如请求的封装,需要的时候再去调用这个命令。这种模式是为了将行为的执行延迟了,将 执行类的对象封装到命令类中,执行类对象的行为就会作为命令类的一个行为,当需要调用时,再将命令传给调用类的对象,调用类的对象直接调用该命令类的对象的这个行为即可。
理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。这个模式其实非常的简单,也就是将要执行的行为封装为一个命令,这个命令可以传给调用者,调用者可以选择在合适的时候去调用。之所以看起来那么复杂,其实是那层概念难以理解,比如 将执行者和调用者解耦。执行者和调用者的含义相似,但是可以将执行者定义为厨师,而调用者可以定义为顾客,而命令可以理解为做麻辣小龙虾。顾客不是直接找厨师做麻小,而是通过菜单点菜,厨师看到菜单就会去做,做好了顾客直接吃就行了。
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()
}