Design Pattern学习笔记 --- Command(命令)模式

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

Command命令模式经过将请求自己封装成一个对象,以期向未知的对象提出请求.而且这个对象可被存储并像其它的对象同样被传递.设计模式

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

㈠意图:ide

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

    -- GOF设计模式spa

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

㈡理解:日志

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

   好比:咱们在界面上提供一个按钮或者菜单;咱们只是规定了要想使按钮(菜单)执行某些动做,必须调用它的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.  
相关文章
相关标签/搜索