设计模式-19.命令模式

157 阅读1分钟

一句话总结

将一个请求封装成一个对象,使得可用不同的请求对客户参数化。队请求排队或记录请求日志,以及支持可撤销的操作。

需求

实现烧烤店下订单需求。

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

命令模式有点

  • 容易实现命令队列
  • 容易将命令记录日志
  • 命令接受方可以选择是否拒绝命令
  • 容易撤销某个命令
  • 增加新的命令类很容易(易扩展)