命令模式(Command)

命令模式(Command :将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
 
命令模式,顾名思义来理解即可,就是客户端发布一个命令(也就是“请求”),而这个命令是已经被封装成一个对象的。即这个命令对象的内部可能已经指定了该命令具体被谁负责执行。就像开发经理从客户那边获取对方的需求(命令),客户在描述具体的需求可以决定是否明确指出该需求的执行方。
 
命令模式的通用类图如下: 

 
上图中, Invoker  类就相当于开发经理, ConcreteCommand  类是具体的命令,它继承自抽象命令类  Command  类,该抽象类中定义了每个命令被执行的方法  execute()  。 Receiver  抽象类定义了对每一个具体的命令的执行方法  action () ,一旦接收到命令则立即行动。这里应该注意的是,每个具体的命令类都必须指定该命令的接收者,否则这命令发布了也没相应的人来完成,那就没戏了。
 
具体代码实现如下:
命令接收者相关类:
 
 
  1. //抽象接收者,定义了每个接收者应该完成的业务逻辑  
  2. abstract class AbstractReceiver {  
  3.     public abstract void doJob();  
  4. }  
  5.  
  6. // 具体接收者01,实现自己真正的业务逻辑  
  7. class Receiver01 extends AbstractReceiver {  
  8.     public void doJob() {  
  9.         System.out.println("接收者01 完成工作 ...\n");  
  10.     }  
  11. }  
  12.  
  13. // 具体接收者02,实现自己真正的业务逻辑  
  14. class Receiver02 extends AbstractReceiver {  
  15.     public void doJob() {  
  16.         System.out.println("接收者02 完成工作 ...\n");  
  17.     }  
命令类:
 
 
  1. // 抽象命令类,定义了每个具体命令被执行的入口方法execute()  
  2. abstract class AbstractCommand {  
  3.     public abstract void execute();  
  4. }  
  5.  
  6. // 具体命令类01,通过构造函数的参数决定了该命令由哪个接收者执行  
  7. class Command01 extends AbstsractCommand {  
  8.     private AbstractReceiver receiver = null;  
  9.  
  10.     public Command01(AbstractReceiver receiver) {  
  11.         this.receiver = receiver;  
  12.     }  
  13.  
  14.     public void execute() {  
  15.               System.out.println("命令01 被发布 ...");  
  16.         this.receiver.doJob();  
  17.     }  
  18. }  
  19.  
  20. // 具体命令类02,通过构造函数的参数决定了该命令由哪个接收者执行  
  21. class Command02 extends AbstractCommand {  
  22.     private AbstractReceiver receiver = null;  
  23.  
  24.     public Command02(AbstractReceiver receiver) {  
  25.         this.receiver = receiver;  
  26.     }  
  27.  
  28.     public void execute() {  
  29.               System.out.println("命令02 被发布 ...");  
  30.         this.receiver.doJob();  
  31.     }  
调用者类:
 
 
  1. // 调用者,负责将具体的命令传送给具体的接收者  
  2. class Invoker {  
  3.     private AbstractCommand command = null;  
  4.  
  5.     public void setCommand(AbstractCommand command) {  
  6.         this.command = command;  
  7.     }  
  8.  
  9.     public void action() {  
  10.         this.command.execute();  
  11.     }  
测试类:
 
 
  1. //测试类  
  2. public class Client {  
  3.     public static void main(String[] args) {  
  4.         // 创建调用者  
  5.         Invoker invoker = new Invoker();  
  6.  
  7.         // 创建一个具体命令,并指定该命令被执行的具体接收者  
  8.         AbstractCommand command01 = new Command01(new Receiver01());  
  9.  
  10.         // 给调用者发布一个具体命令  
  11.         invoker.setCommand(command01);  
  12.  
  13.         // 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行  
  14.         invoker.action();  
  15.           
  16.         AbstractCommand command02 = new Command01(new Receiver02());  
  17.         invoker.setCommand(command02);  
  18.         invoker.action();  
  19.     }  
测试结果:
命令 0 1  被发布  ...
接收者01 完成工作 ...
 
命令 0 2  被发布  ...
接收者02 完成工作 ...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值