14.CommandPattern - QDDCoder/LZLearniOS GitHub Wiki

命令模式

解释地址:https://www.runoob.com/design-pattern/command-pattern.html

命令模式Command Pattern是一种数据驱动的设计模式它属于行为型模式请求以命令的形式包裹在对象中并传给调用对象调用对象寻找可以处理该命令的合适的对象并把该命令传给相应的对象该对象执行命令意图将一个请求封装成一个对象从而使您可以用不同的请求对客户进行参数化主要解决在软件系统中行为请求者与行为实现者通常是一种紧耦合的关系但某些场合比如需要对行为进行记录撤销或重做事务等处理时这种无法抵御变化的紧耦合的设计就不太合适何时使用在某些场合比如要对行为进行"记录、撤销/重做、事务"等处理这种无法抵御变化的紧耦合是不合适的在这种情况下如何将"行为请求者""行为实现者"解耦将一组行为抽象为对象可以实现二者之间的松耦合如何解决通过调用者调用接受者执行命令顺序调用者命令接受者关键代码定义三个角色1received 真正的命令执行对象 2Command 3invoker 使用命令对象的入口
 
 优点1降低了系统耦合度2新的命令可以很容易添加到系统中去缺点使用命令模式可能会导致某些系统有过多的具体命令类使用场景认为是命令的地方都可以使用命令模式比如1GUI 中每一个按钮都是一条命令2模拟 CMD注意事项系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作也可以考虑使用命令模式见命令模式的扩展

1.建一个命令接口。

//1.建一个命令接口。
protocol Order {
    func execute()
}

2.创建一个请求类。

class Stock: NSObject {
    private var name = "ABC"
    private var quantity = 10
    func buy()  {
        print("Stock [name: \(name),Quantity:\(quantity)] bought")
    }
    
    func sell()  {
        print("Stock [name: \(name),Quantity:\(quantity)] sold")
    }
}

3.创建实现了 Order 接口的实体类。

class BuyStock: NSObject,Order {
    private var abcStock:Stock?
    
    init(with stock:Stock) {
        super.init()
        self.abcStock = stock
    }
    
    func execute() {
        self.abcStock?.buy()
    }
}

class SellStock: NSObject,Order {
    private var abcStock:Stock?
    
    init(with stock:Stock) {
        super.init()
        self.abcStock = stock
    }
    
    func execute() {
        self.abcStock?.sell()
    }
}

4.创建命令调用类

class Broker: NSObject {
    private var orderList:[Order] = [Order]()
    
    func takeOrder(with order:Order)  {
        orderList.append(order)
    }
    
    func placeOrders()  {
        orderList.forEach { (order) in
            order.execute()
        }
        orderList.removeAll()
    }
}
  • 测试

let abcStock = Stock()
        
let buyStockOrder = BuyStock(with: abcStock)
let sellStockOrder = SellStock(with: abcStock)

let broker = Broker()
broker.takeOrder(with: buyStockOrder)
broker.takeOrder(with: sellStockOrder)

broker.placeOrders()
  • 测试结果

Stock [name: ABC,Quantity:10] bought
Stock [name: ABC,Quantity:10] sold
⚠️ **GitHub.com Fallback** ⚠️