命令模式

9人阅读 评论(0) 收藏 举报
分类:

转载自 命令模式(Command Pattern)(一):命令模式介绍

一、意图

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

二、适用性

(1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

(2)在不同的时刻指定、排列和执行请求。

(3)支持修改日志、撤销操作。

(4)系统需要将一组操作组合在一起,即支持宏命令。

三、组成

命令模式由以下角色组成:

—— 命令角色(Command):定义命令的接口,声明执行的方法。

——具体命令角色(Concrete Command):实现命令接口,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

——接收者角色(Receiver):负责具体实施和执行一个请求。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

—— 请求者(调用者)角色(Invoker):负责调用命令对象执行请求。

—— 客户角色(Client):创建一个具体命令对象并设定该命令对象的接收者。

四、结构


五、生活中的例子


(Order订单封装了请求)


六、简单实现

1.命令角色

[java] view plain copy
  1. public interface Command  
  2. {  
  3.  public void execute();  
  4. }  

2.具体命令角色

[java] view plain copy
  1. public class ConcreteCommand implements Command  
  2. {  
  3.     // 持有接收者的引用  
  4.     private Receiver receiver;  
  5.   
  6.     public ConcreteCommand(Receiver receiver)  
  7.     {  
  8.         this.receiver = receiver;  
  9.     }  
  10.   
  11.     @Override  
  12.     public void execute()//将命令的执行委托给接收者  
  13.     {  
  14.         receiver.doAction();  
  15.     }  
  16.   
  17. }  

3.接收者角色

[java] view plain copy
  1. public class Receiver  
  2. {  
  3.     //接收者真正执行命令  
  4.     public void doAction()  
  5.     {  
  6.       System.out.println("doAction");  
  7.     }  
  8. }  

4.请求者(执行者)角色

[java] view plain copy
  1. public class Invoker  
  2. {  
  3.     //持有命令对象的引用,将动作委托给命令对象执行  
  4.     private Command command;  
  5.   
  6.     public Invoker(Command command)  
  7.     {  
  8.         this.command = command;  
  9.     }  
  10.   
  11.     public void doInvokerAction()  
  12.     {  
  13.         command.execute();  
  14.     }  
  15. }  

5.客户角色

[java] view plain copy
  1. public class Client  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Receiver receiver = new Receiver();  
  6.         Command command = new ConcreteCommand(receiver);  
  7.   
  8.         Invoker invoker = new Invoker(command);  
  9.   
  10.         invoker.doInvokerAction();  
  11.     }  
  12. }  

七、使用组合模式实现宏命令

[java] view plain copy
  1. public class MacroCommand implements Command  
  2. {  
  3.     Command[] commands;  
  4.     public MacroCommand(Command[] commands)  
  5.     {  
  6.         this.commands=commands;  
  7.     }  
  8.     @Override  
  9.     public void execute()  
  10.     {  
  11.         for(Command command : this.commands)  
  12.           command.execute();  
  13.     }  
  14.   
  15.     @Override  
  16.     public void undo()  
  17.     {  
  18.         for(Command command : this.commands)  
  19.               command.undo();  
  20.   
  21.     }  
  22.   
  23. }  
使用时可以将MacroCommand当做普通命令使用。请求角色并不知道这是一个宏命令。

八、其他

1.命令模式将发出请求的对象和执行请求的对象解耦,两者之间通过命令对象进行沟通。将请求封装成对象,这个对象可以被储存、传递、调用。

2.命令模式降低了对象之间的耦合度,使得我们 可以很轻松地加入新的命令、根据组合的优点轻松设计宏命令等,但是不足之处就是会导致大量具体命令类的产生。

3.实现命令的撤销:在Command中加入undo()方法,在undo()方法中调用receiver的相关方法,Invoker调用Command的undo()方法实现撤销。当请求者(调用者)Invoker持有多个命令对象时,需要在Invoker中加入一个Command引用用来记录最后执行的命令以实现命令撤销。如果想要实现多层次的撤销操作,则在Invoker中就需要使用一个堆栈记录操作过程中的每一个命令,然后从堆栈中取出最上层的命令实现撤销。

4.宏命令的实现使用到了组合模式,可以一次执行一组命令,Invoker并不知道这是一个单一的命令还是宏命令,宏命令更加灵活,更优雅。

5.队列请求功能:工作队列对象并不在乎命令对象具体是干什么的,它只是在队列中取出Command命令对象然后调用其execute()方法。

6.日志请求功能:当每个命令被执行时,可以将Command命令对象存储在磁盘上(序列化等方法),需要时从磁盘上加载命令对象。(在Command接口中加入store()、load()方法)

7.在实际操作中,可省略接收者角色,让命令对象直接实现请求而不是将工作委托给接收者。



查看评论

嵌入式Linux开发基础

嵌入式Linux开发环境的构建,Linux命令行的基本使用,VI、GCC、Makefile基本工具的使用,交叉开发环境的使用。 学习条件: 1.C语言编程基础
  • 2015年12月01日 13:56

命令模式经典讲解

命令模式的讲课给了我新的思考,提高学习效率工作效率从此开始!
  • u010843114
  • u010843114
  • 2015-08-22 11:22:22
  • 1660

命令模式应用场景

Command模式通常可应用到以下场景:    1 Multi-level undo(多级undo操作)      如果系统需要实现多级回退操作,这时如果所有用户的操作都以command对象的形式...
  • zdsicecoco
  • zdsicecoco
  • 2016-05-06 16:06:32
  • 3854

Android源码中的命令模式

前面跟大家分享了装饰者模式、观察者模式、静态工厂方法、工厂方法模式,今天跟大家分享下Android源码中的命令模式。...
  • sdkfjksf
  • sdkfjksf
  • 2016-10-08 13:41:39
  • 3350

java设计模式 命令模式的优点

命令模式的优点: 1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合. 2. 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命...
  • fujianianhua
  • fujianianhua
  • 2011-12-28 20:31:56
  • 2179

代理模式和命令模式的区别

在初学设计模式的时候,对于代理模式(委托)和命令模式总是分不清楚容易混淆,经过...
  • alien75
  • alien75
  • 2014-04-28 19:09:38
  • 2339

“命令模式”深入浅出

命令Command模式是GOF23种模式中的一种,是一种行为模式。这种模式很难理解。《设计模式》一书中对它语焉不详。而网上的一些文章对其的解释也是错误的。实际上,命令模式并不是那么神秘。本文中我会简单...
  • shendl
  • shendl
  • 2006-09-21 15:13:00
  • 13237

命令模式的更多用途:队列请求

命令可以将运算块打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。现在,即使在命令对象被创建许久之后,运算依然可以被调用。事实上,它甚至可以在不同的线程中被调用。我们可以利用这样的...
  • u012822634
  • u012822634
  • 2015-04-13 13:31:27
  • 861

五分钟一个设计模式之命令模式

五分钟一个设计模式,用最简单的方法来描述设计模式。小米智能模块的例子前一段小米的老总雷军在印度的全英文演讲想必大家都还历历在目,不过今天我们讨论的主题不是那次演讲,而是小米智能模块。小米4发布时,雷军...
  • daguanjia11
  • daguanjia11
  • 2015-05-29 06:13:33
  • 1745

Java开发中的23种设计模式详解----命令模式(Command)

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其...
  • sjyttkl
  • sjyttkl
  • 2017-06-21 12:23:41
  • 1638
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 620
    排名: 8万+
    文章存档