深入剖析Ruby设计模式编程中对命令模式的相关使用_ruby专题

命令模式是对象行为型使用率比较高的设计模式,别名: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 Button

 attr_accessor :name, :command

 def initialize name, command
  @name = name
  @command = command
 end

 def do_something
  @command.execute
 end

end

class Command

 def execute
  "root execute"
 end

end

class PaintCommand < Command

 def execute
  "draw something"
 end

end

class VocalCommand < Command

 def execute
  "talk something"
 end

end

paintCommand = PaintCommand.new
vocalCommand = VocalCommand.new
button = Button.new("button", paintCommand)
p button.do_something
button.command = vocalCommand
p button.do_something

 定义了主体类Button,Button聚合一个命令对象Command,声明Command,PaintCommand,VocalCommand三个具有继承的命令类,在系统当中可能存在有多个Button,每个Button所要完成的事情是不一样的,即这个部分是变化的的,也就是方法do_something中的代码也是不确定的,将这部分的代码分离到单独的对象中进行管理,而这个对象就被称为命令对象,命令对象只负责需要完成的任务或者是指令,主体对象可以根据自己的需要在任何时间去调用需要的命令进行执行。在调用处的代码中也非常清晰的发现要切换当前Button的命令实现非常方便,也非常灵活,只需要简单的却调用set方法就可以完成。如果采用Button继承的关系,第一主体对象会造成类爆炸,第二在切换命令实现的时候对比这种方式就会比较困难。
 
使用ruby proc来完成命令模式 :
 

class Button

 attr_accessor :name

 def initialize name, &command
  @name = name
 end

 def do_something &command
  command.call
 end

end

paint_command = lambda do
 p "paint something"
end

vocal_command = lambda do
  p "talk something"
end

button = Button.new ("name")
button.do_something &vocal_command
button.do_something &paint_command

 可以看到使用block来代替命令类更加简单,易懂,在实际项目环境中使用proc和命令可以情况而定,如果命令对象非常复杂,需要有自己的状态和方法,就选用命令类来完成,如果只是简单的处理一些小事情,便可以采用proc
 
如果需要执行的命令过多,可以定义命令队列,也就是一个命令里面管理多个命令, 当调用的时候挨个调用每个命令进行执行,从这一点来非常像组合模式
 
在某中意义上来说观察者模式和命令模式有一些相像,都是聚合一些具有共同特征的对象到自己类,然后根据情况来进行调用。但是2个模式有一个明显的区别,就是用途。观察者模式用于被观察者将变化通知到各个不同的观察者身上,而命令模式并不关心是否是通知到其他命令,命令对象只负责执行自己的任务或者是指令,并且命令模式可以记住前一次的操作,所以一般来说很多文本编辑器的撤销/重做都会用到命令模式。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索设计模式
, ruby
命令模式
ruby原理剖析、ruby原理剖析 pdf、ruby源码剖析、深入剖析android系统、深入剖析tomcat,以便于您获取更多的相关知识。

时间: 2024-11-03 21:38:50

深入剖析Ruby设计模式编程中对命令模式的相关使用_ruby专题的相关文章

Ruby设计模式编程中对外观模式的应用实例分析_ruby专题

何为外观模式?     外观模式为子系统中一组不同的接口提供统一的接口.外观定义了上层接口,通过降低复杂度和隐藏子系统间的通信以及依存关系,让子系统更加易于使用.     比方说子系统中有一组不同的类,其中一些彼此依赖.这让客户端难以使用子系统中的类,因为客户端需要知道每一个类.外观起到整个子系统的入口.有些客户端只需要子系统的某些基本行为,而对子系统的类不做太多定制,外观为这样的客户端提供简化的接口.只有需要从某些子系统的类定制更多行为的客户端,才会关注外观背后的细节.     外观模式:为系

实例解析Ruby设计模式编程中Strategy策略模式的使用_ruby专题

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会.要帮什么忙呢?你很好奇. 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息的功能.他说会传递给你一个包含许多用户名的数组,你需要根据这些用户名把他们相应的数据都给查出来. 这个功能很简单的嘛,你爽快地答应了.由于你们项目使用的是MySQL数据库,你很快地写出了如下代码: require 'mysql' class QueryUtil def find_us

详解组合模式的结构及其在Ruby设计模式编程中的运用_ruby专题

定义:也叫合成模式,或者部分-整体模式,主要是用来描述部分与整体的关系,定义,将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 类图: 角色说明: Componnent抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构. 实例:听说你们公司最近新推

详解Java的设计模式编程中的原型模式_java

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.类型:创建类模式类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法.在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException

详解Java设计模式编程中的访问者模式_java

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.类型:行为类模式类图: 例子:例如,思考一下添加不同类型商品的购物车,当点击结算的时候,它计算出所有不同商品需付的费用.现在,计算逻辑即为计算这些不同类型商品的价格.或者说通过访问者模式我们把此逻辑转移到了另外一个类上面.让我们实现这个访问者模式的例子. 为了实现访问者模式,最先需要做的是创建能够被添加到购物车中代表不同类型商品(itemElement)的类. ItemElement.ja

详解Java设计模式编程中的策略模式_java

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换.类型:行为类模式类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽

实例讲解Java的设计模式编程中责任链模式的运用_java

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.类型:行为类模式类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3.r

Ruby on Rails中MVC结构的数据传递解析_ruby专题

如果读者已经开发过基于 Rails 的应用,但对其 MVC 间的数据传递还有诸多困惑,那么恭喜您,本文正是要总结梳理 Rails 数据传递的方法和技巧.Ruby on Rails 3(以下统称为 Rails 3)是当前的主要发布版本,本文所述及的内容和代码都基于此版本.Rails 3 简介 Ruby on Rails 是一个 Ruby 实现.采用 MVC 模式的开源 Web 应用开发框架,能够提供 Web 应用的全套解决方案.它的"习惯约定优于配置"的设计哲理,使得 Web 开发人员能

Ruby面向对象编程中类的方法与类的扩展_ruby专题

类方法 类方法其实质是生活在该类的单件类中的单件方法.其定义方法有三种,分别是: # 法一 def MyClass.a_class_method; end # 法二 class MyClass def self.anther_class_method; end end # 法三* class MyClass class << self def yet_another_class_method; end end end 其中第三种方法道出了,类方法的实质,特别记忆一下! 类扩展 类扩展通过向类的