一句话总结
将一个请求封装成一个对象,使得可用不同的请求对客户参数化。队请求排队或记录请求日志,以及支持可撤销的操作。
需求
实现烧烤店下订单需求。
Code
用命令模式实现如下
static func main() {
let boy = Barbecuer()
let bakeMuttonCommand1 = BakeMuttonCommand(receiver: boy)
let bakeMuttonCommand2 = BakeMuttonCommand(receiver: boy)
let bakeChickenWingCommand1 = BakeChickenWingCommand(receiver: boy)
let girl = Waiter()
girl.setOrder(command: bakeMuttonCommand1)
girl.setOrder(command: bakeMuttonCommand2)
girl.setOrder(command: bakeChickenWingCommand1)
girl.notify()
}
class Barbecuer {
func bakeMutton() {
print("烤羊肉串")
}
func bakeChickenWing() {
print("烤鸡翅")
}
}
protocol Command {
var receiver: Barbecuer { get set }
func excuteCommand()
}
class BakeMuttonCommand: Command {
var receiver: Barbecuer
init(receiver: Barbecuer) {
self.receiver = receiver
}
func excuteCommand() {
receiver.bakeMutton()
}
}
class BakeChickenWingCommand: Command {
var receiver: Barbecuer
init(receiver: Barbecuer) {
self.receiver = receiver
}
func excuteCommand() {
receiver.bakeChickenWing()
}
}
class Waiter {
var orders: [Command] = []
func setOrder(command: Command) {
if command is BakeChickenWingCommand {
print("服务员:烤鸡翅没有了")
} else if command is BakeMuttonCommand {
orders.append(command)
print("增加订单:烤羊肉串 时间:\(Date())")
}
}
func notify() {
for item in orders {
item.excuteCommand()
}
}
}
命令模式有点
- 容易实现命令队列
- 容易将命令记录日志
- 命令接受方可以选择是否拒绝命令
- 容易撤销某个命令
- 增加新的命令类很容易(易扩展)