美文网首页
Swift中设计模式的实践二:命令模式

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

作者: Supremodeamor | 来源:发表于2017-12-05 11:47 被阅读30次

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

    相关文章

      网友评论

          本文标题:Swift中设计模式的实践二:命令模式

          本文链接:https://www.haomeiwen.com/subject/gbmqixtx.html