Swift中设计模式的实践二:命令模式

2017-12-05  本文已影响30人  Supremodeamor

本文是对Design Patterns implemented in Swift 3.0的解读和翻译,通过这些案例对Swift中的设计模式进行总结和加深理解。
本文示例代码都是在Xcode的Playground上运行的。

命令模式(Command Pattern)

命令模式属于行为型模式,对象的请求可以被看做为一个命令,将命令包裹到对象中,这个调用对象则可以寻求处理命令的接收对象。命令的接收对象则是独立的。
原理:调用对象对接收对象发送命令,接收对象负责命令的具体执行。
目的:将请求与接收进行解耦,提高命令代码的复用性。
示例说明:

门作为指令调用对象,“开”和“关”作为两个命令,分别由OpenCommandCloseCommand两个接收对象负责执行。

示例:

protocol DoorCommand {
    func execute() -> String
}

class OpenCommand : DoorCommand {
    let doors:String

    required init(doors: String) {
        self.doors = doors
    }
    
    func execute() -> String {
        return "Opened \(doors)"
    }
}

class CloseCommand : DoorCommand {
    let doors:String

    required init(doors: String) {
        self.doors = doors
    }
    
    func execute() -> String {
        return "Closed \(doors)"
    }
}

class HAL9000DoorsOperations {
    let openCommand: DoorCommand
    let closeCommand: DoorCommand
    
    init(doors: String) {
        self.openCommand = OpenCommand(doors:doors)
        self.closeCommand = CloseCommand(doors:doors)
    }
    
    func close() -> String {
        return closeCommand.execute()
    }
    
    func open() -> String {
        return openCommand.execute()
    }
}

调用及结果:

let podBayDoors = "Pod Bay Doors"
let doorModule = HAL9000DoorsOperations(doors:podBayDoors)

doorModule.open()  // "Opened Pod Bay Doors"
doorModule.close()  //"Closed Pod Bay Doors"

示例分析:

  1. 抽象化命令对象,OpenCommand类和CloseCommand类均遵守DoorCommand协议,作为命令的接收者,它们都实现了执行命令的execute方法。
  2. HAL9000DoorsOperations是命令调用的具体类,该类将“开”“关”请求以命令的形式传给具体的接收者去执行。
小结:

如果我们需要“推”“拉”请求,我们可以很容易的封装“推”“拉”命令的接收者,然后为HAL9000DoorsOperations类添加推拉命令。如果我们有另一种“门”,也可以很方便的给其添加所需要的命令,而命令的接收者则不需要任何改变。这就是命令模式的好处,“门”本身不再负责具体“开关”的请求处理,而是向可以处理“开关”的对象发送命令。这样我们可以将命令的接收者分离出来,继而可以复用它们。大大降低了系统的耦合度和灵活性。

上一篇下一篇

猜你喜欢

热点阅读