java设计模式——命令模式

转自:http://lwbbupt.iteye.com/blog/2161021


java设计模式——命令模式

一、什么情况下考虑使用“命令设计模式”?

                 当我们考虑的场景中需要“动作的请求者”与“动作的执行者”之间解耦,也就是说动作的发起端不必知道动作是如何执行的,只需要下达“命令”就可以执行相应的动作,相当于把方法的调用也封装了起来,只需要对“命令对象”调用统一的方法,然而“命令对象”会知道如何执行相应的方法。

        命令模式中的一些概念:        

        命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也只支持可撤销的操作。

        命令对象:将动作以及接收者包装成一个对象,只对外暴露一个特定的方法,当这一特定方法被调用时,接收者就会执行相应的动作。

 

二、如何是实现“命令设计模式”?

       考虑如下场景:需要我们设计一个遥控器,上面有两个按钮,按下时分别为打开电灯,关闭电灯(当然也可以换为开关风扇等等)。此时我们可以考虑使用命令模式。

      ①我们让所有的命令对象实现命令接口:

Java代码   收藏代码
  1. public interface Command {  
  2.     public void execute();  
  3. }  

     ②建立对应的命令对象:

     针对已存在的对象Light建立命令对象

Java代码   收藏代码
  1. public class Light {  
  2.     public void on(){  
  3.         System.out.println("Light is on");  
  4.     }  
  5.   
  6.     public void off(){  
  7.         System.out.println("light is off");  
  8.     }  
  9. }  

    打开电灯命令对象(构造函数可以设置具体的对象):

Java代码   收藏代码
  1. public class LightOnCommand implements Command {  
  2.     Light light;  
  3.   
  4.     public LightOnCommand(Light light) {  
  5.         this.light = light;  
  6.     }  
  7.   
  8.     @Override  
  9.     public void execute() {  
  10.         light.on();  
  11.     }  
  12. }  

   关闭电灯命令对象:

  

Java代码   收藏代码
  1. public class LightOffCommand implements Command {  
  2.     Light light;  
  3.   
  4.     public LightOffCommand(Light light){  
  5.         this.light = light;  
  6.     }  
  7.   
  8.     @Override  
  9.     public void execute() {  
  10.         light.off();  
  11.     }  
  12. }  

   ③建立动作“请求者”——遥控器

   

Java代码   收藏代码
  1. public class SimpleRemoteControl {  
  2.     Command onCommand;  
  3.     Command offCommad;  
  4.   
  5.     public void setOnCommand(Command onCommand) {  
  6.         this.onCommand = onCommand;  
  7.     }  
  8.   
  9.     public void setOffCommad(Command offCommad) {  
  10.         this.offCommad = offCommad;  
  11.     }  
  12.   
  13.     public void onButtonWasPressed(){  
  14.         onCommand.execute();  
  15.     }  
  16.     public void offButtonWasPressed(){  
  17.         offCommad.execute();  
  18.     }  
  19. }  

  ④为遥控器初始化相应的开关灯的命令。

Java代码   收藏代码
  1. public class RemoteControlTest {  
  2.     public static void main(String[] args) {  
  3.         SimpleRemoteControl remoteControl = new SimpleRemoteControl();  
  4.         Light light = new Light();  
  5.         LightOnCommand lightOnCommand = new LightOnCommand(light);  
  6.         LightOffCommand lightOffCommand = new LightOffCommand(light);  
  7.   
  8.         remoteControl.setOnCommand(lightOnCommand);  
  9.         remoteControl.setOffCommad(lightOffCommand);  
  10.   
  11.         remoteControl.onButtonWasPressed();  
  12.         remoteControl.offButtonWasPressed();  
  13.   
  14.     }  
  15. }  

    
java设计模式——命令模式三、命令模式的其他应用:

         上面只是最简单的命令模式,我们可以使用宏命令,即为动作的执行为多个命令对象的集合,我们可以让灯闪烁,只要循环执行LightOnCommad与LightOffCommand即可。

         我们可以建立一个命令对象的队列,只需要不断的取出命令对象一个一个执行,这样就可已建立一个日程安排了。命令模式还可以用于线程池、工作队列,事务处理等等。
 

你可能感兴趣的:(java设计模式)