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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 如何开机## 估计有些朋友看到这个标题会非常奇怪,电脑装配好了,如何开机?不就是按下启动按...
    七寸知架构阅读 2,856评论 1 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,121评论 6 13
  • 目录 本文的结构如下: 什么是命令模式 为什么要用该模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 总...
    w1992wishes阅读 1,148评论 2 9
  • 1.感赏儿子能认真完成老师的作业,做作业不让家长操心。 2.感赏儿子性格平和,和同学相处很好。 3.感赏儿子老师能...
    扮好自己的角色阅读 127评论 1 2