Command(命令)模式属于对象行为型模式;

Command命令模式通过将请求本身封装成一个对象,以期向未知的对象提出请求.并且这个对象可被存储并像其它的对象一样被传递.

实现Command模式的关键在于抽象出一个Command类;这个类定义了一个可执行操作的接口(抽象方法).具体的Command子类依赖一个接收都类的实例变量,在具体的Command子类实现抽象方法时调用接收者的动作以完成相应的操作.

㈠意图:

    将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排除或者记录请求日志;以及支持可撤销的操作;

    -- GOF设计模式

   功力暂时不够,不是很懂这句话的意思.

㈡理解:

   必须向某对象提交请求;但是并不知道关于被请求的操作或请求的执行都的任何信息;

   比如:我们在界面上提供一个按钮或者菜单;我们只是规定了要想使按钮(菜单)执行某些动作,必须调用它的Click方法;这时我们就可以考虑用Command模式;和接口回调有点相似;都是将具体的执行交由客户来完成;

㈢UML图:

 

㈣场景描述:

  考虑一个计算器模型的设计:

  计算器的大致框架我们作为厂商可以提供出来;一排排的按钮和点击这些按钮可以触发一些操作;(作为计算器模型的硬件提供商) Command(抽象类)

  计算器的软件提供商则会对计算器的具体按钮进行封装; 具体Command类

  每一个不同类型的Command类会执行相应的动作;进行加,减,乘,除的操作;(调用真正地处理方法)

  而传入的数据则对应每个具体的接收者.(加1, 加2, 加3, 加4)

  没有按"="号之前就相当于维护在一个Invoker,去不断地接收命令.

(五)代码实现:

 
  
  1. /** 
  2.  * Command模式中的command抽象类 
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public abstract class Command { 
  11.     protected abstract void command(); 
 
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class AddCommand extends Command { 
  11.  
  12.     private AddReceiver addReceiver; 
  13.     public AddCommand(AddReceiver addReceiver) 
  14.     { 
  15.         this.addReceiver = addReceiver; 
  16.     } 
  17.      
  18.     @Override 
  19.     protected void command() { 
  20.         addReceiver.add(); 
  21.     } 
  22.  
 
  
  1. /** 
  2.  * Command模式中的Receiver操作;知道如何实施和执行一个相关的操作;任何类都可能作为一个接收者 
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class AddReceiver { 
  11.      
  12.     public void add() 
  13.     { 
  14.         System.out.println(" 加上一 "); 
  15.     } 
  16.      
  17.  

 

 
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  *  
  8.  * @author hubert 
  9.  * 
  10.  */ 
  11. public class SubtractionCommand extends Command{ 
  12.  
  13.     private SubtractionReceiver subtractionReceiver; 
  14.      
  15.     public SubtractionCommand(SubtractionReceiver subtractionReceiver) 
  16.     { 
  17.         this.subtractionReceiver = subtractionReceiver; 
  18.     } 
  19.      
  20.     @Override 
  21.     protected void command() { 
  22.         // TODO Auto-generated method stub 
  23.         subtractionReceiver.subtract(); 
  24.     } 
  25.  

 

 
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. import java.util.ArrayList; 
  7. import java.util.List; 
  8.  
  9. /** 
  10.  * @author hubert 
  11.  * 
  12.  */ 
  13. public class Invoker { 
  14.      
  15.     private List<Command> commandSeq = new ArrayList<Command>(); 
  16.      
  17.     public List<Command> getCommandSeq() { 
  18.         return commandSeq; 
  19.     } 
  20.  
  21.     public void setCommandSeq(List<Command> commandSeq) { 
  22.         this.commandSeq = commandSeq; 
  23.     } 
  24.  
  25.     public List<Command> addCommand(Command command) 
  26.     { 
  27.         commandSeq.add(command); 
  28.         return commandSeq; 
  29.     } 
  30.      
  31.     public List<Command> removeCommand(Command command) 
  32.     { 
  33.         if(this.commandSeq != null && this.commandSeq.contains(command)) 
  34.         { 
  35.             commandSeq.remove(command); 
  36.         } 
  37.          
  38.         return commandSeq; 
  39.     } 
  40.      
 
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class SubtractionReceiver { 
  11.     public void subtract() 
  12.     { 
  13.         System.out.println(" 减少一 "); 
  14.     } 

 

 
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class Client { 
  11.  
  12.     /** 
  13.      * @param args 
  14.      */ 
  15.     public static void main(String[] args) { 
  16.          
  17.         AddReceiver addReceiver = new AddReceiver(); 
  18.         Command addCommand = new AddCommand(addReceiver); 
  19.          
  20.          
  21.         SubtractionReceiver subtractionReceiver = new SubtractionReceiver(); 
  22.         Command subCommand = new SubtractionCommand(subtractionReceiver); 
  23.          
  24.         Invoker invoker = new Invoker(); 
  25.         invoker.addCommand(addCommand).add(subCommand); 
  26.          
  27.         for(Command command : invoker.getCommandSeq()) 
  28.         { 
  29.             command.command(); 
  30.         } 
  31.  
  32.     } 
  33.