命令模式

2019-03-31  本文已影响0人  一毛钱

命令模式-定义

命令模式(Command Pattern)
第一点:将一个请求封装成为一个对象,从而让用户使用不同的请求将客户端参数化。
第二点:对请求排队或者纪录请求日志,以及支持撤销操作说白了:让我们程序扩展性更加好了,耦合降低了。

命令模式-应用场景

当需要将方法调用包装成一个对象,以延时方法调用,或者让其他组件在对其内部实现细节不了解的情况下进行调用的时候可以使用命令模式
场景一:应用程序支持撤销和恢复
场景二:记录请求日志,当系统故障这些命令可以重新被执行
场景三:想用对象参数化一个动作以执行操作,并且用不同命令对象来替换回调函数

命令模式 角色划分:

角色一:接收者
角色二:命令接口
角色三:具体命令
角色四:请求者

案例代码:

//角色一:命令接口(抽象命令)->TMCommandProtocol
protocol TMCommandProtocol {
    func execute()
}
class TMLeftCommand: TMCommandProtocol {
    
    private var tm:TetrisMachine
    
    init(_ tm:TetrisMachine) {
        self.tm = tm
    }
    
    func execute() {
        self.tm.toLeft()
    }
    
}
class TMRightCommand: TMCommandProtocol {
    
    private var tm:TetrisMachine
    
    init(_ tm:TetrisMachine) {
        self.tm = tm
    }
    
    func execute() {
        self.tm.toRight()
    }
    
}
class TMTransformCommand: TMCommandProtocol {
    
    private var tm:TetrisMachine
    
    init(_ tm:TetrisMachine) {
        self.tm = tm
    }
    
    func execute() {
        self.tm.toTransform()
    }
    
}

class TetrisMachine: NSObject {
    
    //具体业务逻辑
    func toLeft(){
        print("左边")
    }
    
    func toRight(){
        print("右边")
    }
    
    func toTransform(){
        print("变形")
    }
    
}
class TetrisMachineManager {
    
    private var commands = Array<TMCommandProtocol>()
    private var tm:TetrisMachine
    private var left:TMLeftCommand
    private var right:TMRightCommand
    private var transform:TMTransformCommand
    
    init(tm:TetrisMachine, left:TMLeftCommand, right:TMRightCommand, transform:TMTransformCommand) {
        self.tm = tm
        self.left = left
        self.right = right
        self.transform = transform
    }

    func toLeft(){
        self.left.execute()
        self.commands.append(TMLeftCommand(self.tm))
    }
    
    func toRight(){
        self.right.execute()
        self.commands.append(TMRightCommand(self.tm))
    }
    
    func toTransform(){
        self.transform.execute()
        self.commands.append(TMTransformCommand(self.tm))
    }
    
    //撤销
    func undo() {
        if self.commands.count > 0 {
            self.commands.removeLast().execute()
        }
    }  
}
// 外部调用
let tm = TetrisMachine()
let left = TMLeftCommand(tm)
let right = TMRightCommand(tm)
let transform = TMTransformCommand(tm)
let manager = TetrisMachineManager(tm: tm, left: left, right: right, transform: transform)
manager.toLeft()
manager.toRight()
manager.toTransform()

manager.undo()
上一篇 下一篇

猜你喜欢

热点阅读