16-命令(Command)模式Ruby实现

Posted 架构设计模式

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16-命令(Command)模式Ruby实现相关的知识,希望对你有一定的参考价值。

摘要:本文用一个实例场景描述Gof 23设计模式中的命令(Command)模式,并用Ruby程序代码给予实现,同时也给出实现代码的UML模型。

关键字Gof 23 设计模式 命令模式 Ruby

Command Pattern basedon Ruby

REN gang

Abstract:This paper gives a scene example to describe theuse of Command Pattern of Gof 23 Design Pattern, and achieves the example by Ruby,at the same time, gives the UML model of realization of the example.

Key word: Gof 23; DesignPattern; Command Pattern  Ruby

 

1. 标准定义

命令(Command)模式标准定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

2. 分析和说明

命令(Command)模式属于对象行为型模式。命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

命令(Command)模式结构如图1所示,其角色包括客户(Client)角色、命令(Command)角色、具体命令(Concrete Command)角色和接收者(Receiver)角色。

 
1命令模式结构

    客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。

    命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个Java接口或Java抽象类实现。

    具体命令(Concrete Command)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。

    接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

 

3 应用场景举例

比如公司的一位管理者要对下属安排工作,就可以通过命令模式。管理者是客户角色:命令角色是一个抽象类:安排工作就是具体命令角色,具体包括要求编写工作计划、上报工作报告等。下属就是接收者角色。比如说老李这个管理者安排小王编写工作计划和上报工作报告。

在这里可以把Manager类理解为客户(Client)角色。Command抽象类是命令(Command)角色。Computer是一种抽象产品(Product)角色。PlanCommand类和ReportCommand类是具体命令(Concrete Command)角色。Subordinate类是接收者(Receiver)角色。其实现类图如图2所示。Manager类聚合Command抽象类,Command抽象类聚合Subordinate类,PlanCommand类和ReportCommand类继承Command抽象类。


2 命令模式类图

 

4Ruby的实现程序代码

Ruby程序实现主要包括Command类,Manager类,Subordinate类,PlanCommand类和ReportCommand类等5个类。其关系如图2所示。下面分别列出这5个类的程序代码,最后列出测试代码并显示输出结果。

程序代码清单

 

 

#!/behavioralpatterns/command

 

class Subordinate

      

       def  initialize(name)

       @name = name

     end

      

       def  Subordinate(subordinateName)

              @name  = subordinateName;

       end

 

       def  getName

              @name

       end

 

       def  setName(name)

              @name  = name

       end

      

       def  executeCommand(task)

              puts  @name + "执行" +  task + "的命令"

       end  

end

 

 class Command

             

       def  initialize()

       @man = nil

     end

      

       def  setMan(man)

              @man  = man

       end

      

       def  Execute

       end

end

 

class Manager

      

       def  initialize()

       @command = nil

     end

 

       def  setCommand(command)

              @command  = command

       end

 

       def  ExecuteCommand

              @command.Execute()

       end

end

 

class PlanCommand < Command

      

       def  Execute

              puts  "——————编写计划——————"

              @man.executeCommand("编写计划");

       end

end

 

class ReportCommand  < Command

      

       def  Execute

              puts  "——————编写报告——————"

              @man.executeCommand("编写报告");

       end

end

 

 

# ————————main主程序应用————————

 

#可以分为两个场景来处理

subordinate = Subordinate.new("小刘");

command1 = ReportCommand.new                                 

command1.setMan(subordinate)

             

manager = Manager.new

manager.setCommand(command1)      

manager.ExecuteCommand

             

command2 = PlanCommand.new

command2.setMan(subordinate)

manager.setCommand(command2)      

manager.ExecuteCommand

 

BEGIN {

    puts "———这是command的输出开始———"

}

 

END {

    puts "———这是command的输出结束———"

}

 

 

命令模式测试类输出结果如下所示:

———这是command的输出开始———

——————编写报告——————

小刘执行编写报告的命令

——————编写计划——————

小刘执行编写计划的命令

———这是command的输出结束———

 

 

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.20009

[3] (日)高桥征义,(日)后藤裕藏 著,何文斯 译,Ruby基础教程(第4版),北京:人民邮电出版社.2014.09

[4] 许勇 等编著,Ruby on Rails 程序设计 深入剖析与范例应用,北京:清华大学出版社.2013.07

[5] (美)梅茨 著,张雪平,彭晓东译,面向对象设计实践指南:Ruby语言描述,北京:人民邮电出版社.2014.01

[6] Ruby官方网站:www.ruby-lang.org

[7] Ruby教程 http://www.runoob.com/ruby/ruby-tutorial.html

 


以上是关于16-命令(Command)模式Ruby实现的主要内容,如果未能解决你的问题,请参考以下文章

蛋疼的命令模式。(转)

Java设计模式-命令模式Command

命令模式(Command)

命令模式(Command Pattern)

Command(命令)

设计模式-命令模式(Command)