浏览 1976 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-08
最后修改:2010-01-13
意图: 将一个请求封装为一个对象,从而使你可对不同的请求进行参数化;对请求排队或记录请求日志,以及支持可取消的操作 这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。 动机: 方便扩展 结构: 协作说明: 参与角色: Command 声明一个接口以用来实现某个操作。 ConcreteCommand 将动作与Reciver对外绑定,通过调用Reciver对象的相应方法来实现Command的方法。 Client 创建ConcreteCommand对象,并设置其Reciver对象。 Invoker 要求该Command实现请求。 Reciver 知道如何实现具体的请求的类。 客户端创建了一个具体的Command对象并指定了其接收者。 调用者对象存储了此具体的Command对象。 调用者对象通过执行Command对象的Execute方法来实现当前请求。 如果命令是可以撤销时,具体对象在调用执行方法前将存储相应的状态以用来命令此请求。 具体的Command对象调用其接收者的方法从而来实现相应请求。 适用性:
动态性方面: 像ruby中 block 就是命令模式 效果:
实现时应考虑命令对象应达到何种智能程序和支持撤消和重做这两个问题. 误用:
这里特别讲下观察者模式和命令模式的区别, 观察者模式没有顺序性,它的顺序不可把握,而命令模式是有顺序的,具备队列性质,并可撤销. 下面是个小例子,模拟短消息定服务: 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 类图: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |