深入剖析Ruby设计模式编程中对命令模式的相关使用
命令模式是对象行为型使用率比较高的设计模式,别名:Action(动作),Transaction(事务) 意图: 将一个请求封装为一个对象,从而使你可对不同的请求进行参数化;对请求排队或记录请求日志,以及支持可取消的操作 动机: 方便扩展 结构: 协作说明:
效果:
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继承的关系,第一主体对象会造成类爆炸,第二在切换命令实现的时候对比这种方式就会比较困难。 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |