`

设计模式与动态语言之命令模式 Command

阅读更多
命令模式是对象行为型使用率比较高的设计模式,别名:Action(动作),Transaction(事务)

意图: 将一个请求封装为一个对象,从而使你可对不同的请求进行参数化;对请求排队或记录请求日志,以及支持可取消的操作
这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。

动机: 方便扩展

结构:






协作说明:
   参与角色:
    Command 声明一个接口以用来实现某个操作。
    ConcreteCommand 将动作与Reciver对外绑定,通过调用Reciver对象的相应方法来实现Command的方法。
    Client 创建ConcreteCommand对象,并设置其Reciver对象。
  Invoker 要求该Command实现请求。
  Reciver 知道如何实现具体的请求的类。
  客户端创建了一个具体的Command对象并指定了其接收者。
  调用者对象存储了此具体的Command对象。
  调用者对象通过执行Command对象的Execute方法来实现当前请求。
  如果命令是可以撤销时,具体对象在调用执行方法前将存储相应的状态以用来命令此请求。
  具体的Command对象调用其接收者的方法从而来实现相应请求。


适用性:
  • 类似于 MenuItem , 抽象出待执行的动作以参数化某对象
  • 在不同的时刻指定,排列,执行请求
  • 支持撤消
  • 支持修改日志
  • 在构建在原语操作上的高层操作构造一个系统(其实就是事务)


动态性方面: 像ruby中 block 就是命令模式

效果:
  • 命令模式将调用者对象与接收对象解耦(调用与实现解耦)。调用者实现功能时只需调用Command接口的Execute方法。
  • 具体的Commands对象是第一层对象,它们可以像其他对象一样被扩展或操作。
  • 你可以将多个Commands对象聚合成一个组合命令。组合命令也是组合对象模式的一个实例,将命令排队也是其的一种特殊情况。
  • 你可以很容易的添加新的命令,因为你并不需要修改现有的代码。这也符合了开闭原则,对修改关闭,对扩展开放。


实现时应考虑命令对象应达到何种智能程序和支持撤消和重做这两个问题.


误用:
  • 不要着迷 到底哪个简单?
  • 命令模式不是说“做这个” 说“ 记住这个如何做”,稍后再说”按照我刚才要你记住的方法做这个”
  • 小心撤销,许多操作是破坏性的,如删除文件操作


这里特别讲下观察者模式和命令模式的区别,
观察者模式没有顺序性,它的顺序不可把握,而命令模式是有顺序的,具备队列性质,并可撤销.

下面是个小例子,模拟短消息定服务:

class SmsService
  attr_accessor :service_list

  def initialize
    @service_list = []
  end

  def add_message(service)
    @service_list << service
  end

  def do
    @service_list.each do |sl|
      sl.exec
    end
  end
end

class ServiceSystem
  def do
    puts '执行成功'
  end
end

class Service
  attr_accessor :service_system

  def initialize(s)
    @service_system = s
  end
end

class ApplyShowNumberService < Service
  def exec
    puts '正在申请电显示服务'
    service_system.do
  end
end

class CancelShowNumberService < Service
  def exec
    puts '正在取消来电显示服务'
    service_system.do
  end
end

ss = SmsService.new
ss.add_message(ApplyShowNumberService.new(ServiceSystem.new))
ss.add_message(CancelShowNumberService.new(ServiceSystem.new))
ss.do



类图:


  • 大小: 9.7 KB
  • 大小: 27 KB
分享到:
评论

相关推荐

    GOLF设计模式(C++语言版)

    目 录 序言 前言 读者指南 第1章 引言 1 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    设计模式--C++

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录 A 词汇表 238 附录 B 图示符号指南 241 附录 C 基本类 244 参考文献 249

    设计模式 GOF 23

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    设计模式:可复用面向对象软件的基础--详细书签版

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    《设计模式》中文版(23个设计模式的介绍与运用)

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式(.PDF)

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    《国外写的,翻译版本》设计模式

    最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式文档

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    C#23种设计模式_示例源代码及PDF

    命令模式把发出命令的责任 命令模式 和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方 独 立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收, 以及...

    [源代码] 《易学 设计模式》 随书源代码

    第21章 独具匠心:命令模式 (Command) 第22章 步调一致:访问者模式 (Visitor) 第23章 左右逢源:调停者模式 (Mediator) 第24章 白纸黑字:备忘录模式 (Memento) 第25章 周而复始:迭代器模式 (Iterator) 第26章 ...

    设计模式 design pattern

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    JAVA经典设计模式大全

    目 录 序言 前言 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    软件设计师必读的书-设计模式

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式___

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    GoF 的 23 种设计模式

    GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一...

    设计模式part1

    目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计...

    设计模式part2

    目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计...

    设计模式可复用面向对象软件的基础.

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

Global site tag (gtag.js) - Google Analytics