首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

ruby设计方式-命令模式

2012-10-12 
ruby设计模式--命令模式当需要设计一组可以被执行的任务或者指令时候,将会用到命令模式,通过命令模式可以

ruby设计模式--命令模式

当需要设计一组可以被执行的任务或者指令时候,将会用到命令模式,通过命令模式可以将变化的任务或者命令从不变的核心代码中剥离出去,从而降低系统对象之间的耦合度。

?

class Button    attr_accessor :name, :command    def initialize name, command    @name = name    @command = command  end    def do_something    @command.execute  end  endclass Command    def execute    "root execute"  end  endclass PaintCommand < Command    def execute    "draw something"  end  endclass VocalCommand < Command    def execute    "talk something"  end  endpaintCommand = PaintCommand.newvocalCommand = VocalCommand.newbutton = Button.new("button", paintCommand)p button.do_somethingbutton.command = vocalCommandp 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  endpaint_command = lambda do  p "paint something"endvocal_command = lambda do   p "talk something"endbutton = Button.new ("name")button.do_something &vocal_commandbutton.do_something &paint_command

?可以看到使用block来代替命令类更加简单,易懂,在实际项目环境中使用proc和命令可以情况而定,如果命令对象非常复杂,需要有自己的状态和方法,就选用命令类来完成,如果只是简单的处理一些小事情,便可以采用proc

?

如果需要执行的命令过多,可以定义命令队列,也就是一个命令里面管理多个命令, 当调用的时候挨个调用每个命令进行执行,从这一点来非常像组合模式

?

在某中意义上来说观察者模式和命令模式有一些相像,都是聚合一些具有共同特征的对象到自己类,然后根据情况来进行调用。但是2个模式有一个明显的区别,就是用途。观察者模式用于被观察者将变化通知到各个不同的观察者身上,而命令模式并不关心是否是通知到其他命令,命令对象只负责执行自己的任务或者是指令,并且命令模式可以记住前一次的操作,所以一般来说很多文本编辑器的撤销/重做都会用到命令模式。

热点排行