命令模式----COMMAND PATTERN

        一般设计过程中我们可能把别人发起的事件一个一个执行下去,这样设计过于被动,但是通过命令模式把这个命令通过一个中间人Invoker把这些命令进行组装以后它把请求方(Invoker)和执行方(Receiver)分开了,扩展性也有很好的保障。

        其实我们在代码重构过程中也可以用命令模式对一些老代码进行重写。可能我们在代码前期没有想过代码设计,可能为图方便把代码开发完成,导致后来代码越来越难以维护。

         命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。

  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

以下代码都是网上拷贝。

一.概念

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

 

二.UML

 

  1. Recevier(动作的接收者) ,动作具体执行者,就是干活的人。
  2. Command(命令对象接口),调用命令对象的execute方法,就可以让接收者进行相关的动作。
  3. ConcreteCommand(具体命令),将一个接收者对象绑定在一个操作命令对象上。
  4. Invoker(调用者),持有一个命令对象,并在某个时间点调用命令对象的excute方法,将请求付诸行动。
  5. Client(客户端),负责创建一个具体命令对象,并设置其接收者。

三.代码

     Recevier

Java代码   收藏代码
  1. package com.zzy.command;  
  2.   
  3. /** 
  4.  * 动作的接收者 
  5.  * @author eason 
  6.  * 
  7.  */  
  8. public class Receiver {  
  9.     public void action() {  
  10.         System.out.println("Receiver action()");  
  11.     }  
  12. }  

 

     Command

Java代码   收藏代码
  1. package com.zzy.command;  
  2.   
  3. /** 
  4.  * 命令对象的抽象类 
  5.  * @author eason 
  6.  * 
  7.  */  
  8. public abstract class Command {  
  9.       
  10.     protected Receiver receiver;  
  11.       
  12.     public Command(Receiver receiver) {  
  13.         this.receiver = receiver;  
  14.     }  
  15.       
  16.     public abstract void execute();  
  17.       
  18. }  

 

     ConcreteCommand

Java代码   收藏代码
  1. package com.zzy.command;  
  2.   
  3. /** 
  4.  * 命令对象具体类 
  5.  * 将一个接收者Receiver绑定在一个操作ConcreteCommand上 
  6.  * @author eason 
  7.  * 
  8.  */  
  9. public class ConcreteCommand extends Command {  
  10.   
  11.     public ConcreteCommand(Receiver receiver) {  
  12.         super(receiver);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void execute() {  
  17.         receiver.action();  
  18.     }  
  19.   
  20. }  

 

     Invoker

Java代码   收藏代码
  1. package com.zzy.command;  
  2.   
  3. /** 
  4.  * 调用者 
  5.  * @author eason 
  6.  * 
  7.  */  
  8. public class Invoker {  
  9.       
  10.     private Command command;  
  11.       
  12.     public void setCommand(Command command) {  
  13.         this.command = command;  
  14.     }  
  15.       
  16.     public void executeCommand() {  
  17.         command.execute();  
  18.     }  
  19. }  

 

     TestCommand

Java代码   收藏代码
  1. package com.zzy.command;  
  2.   
  3. /** 
  4.  * client 
  5.  * @author eason 
  6.  * 
  7.  */  
  8. public class TestCommand {  
  9.       
  10.     public static void main(String[] args) {  
  11.         Receiver receiver = new Receiver();  
  12.         Command command = new ConcreteCommand(receiver);  
  13.         Invoker invoker = new Invoker();  
  14.         invoker.setCommand(command);  
  15.         invoker.executeCommand();  
  16.     }  
  17. }  

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值