别名:Action或者Transaction
1.1.1功能
Command模式通过将请求封装到一个对象(Command)中,并将请求的接受者(Receiver)存放到具体的ConcreteCommand类中中,从而实现调用操作的对象和操作的具体实现者之间的解耦。
1.1.2结构图与协作关系
备注:我认为这张图应该在client与Invoker直接也画条线(箭头指向Invoker)可能更好一点.
• C o m m a n d
— 声明执行操作的接口。
• C o n c r e t e C o m m a n d ( P a s t e C om m a n d,Op e n C o m m a n d )
— 将一个接收者对象绑定于一个动作。
— 调用接收者相应的操作,以实现E x e c u t e。
• C l i e n t ( A p p l i c t i o n )
— 创建一个具体命令对象并设定它的接收者。
• Invoker ( M e n u I t e m )
— 要求该命令执行这个请求。
• R e c e i v e r ( D o c u m e n t,A p p li c a t i o n )
— 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
协作关系:
•C l i e n t创建一个Co n c r e t e C o m m a n d对象并指定它的Re c e i v e r对象。
• 某I n v o k e r对象存储该 C o n c r e t e C o m ma n d对象。
• 该In v o k e r 通过调用Co m m a n d对象的Ex e c u t e操作来提交一个请求。若该命令是可撤消的,Co n c r e t e C o m m a n d就在执行Ex c u t e操作之前存储当前状态以用于取消该命令。
•ConcreteCommand对象对调用它的Re c e i v e r的一些操作以执行该请求。
1.1.3Java源代码
接收者角色类
1. public class Receiver {
2. /**
3. * 真正执行命令相应的操作
4. */
5. public void action(){
6. System.out.println("执行操作");
7. }
8. }
抽象命令角色类
1. public interface Command {
2. /**
3. * 执行方法
4. */
5. void execute();
6. }
具体命令角色类
1. public class ConcreteCommand implements Command {
2. //持有相应的接收者对象
3. private Receiver receiver = null;
4. /**
5. * 构造方法
6. */
7. publicConcreteCommand(Receiver receiver){
8. this.receiver = receiver;
9. }
10. @Override
11. public void execute() {
12. //通常会转调接收者对象的相应方法,让接收者来真正执行功能
13. receiver.action();
14. }
15.
16.}
请求者角色类
1. public class Invoker {
2. /**
3. * 持有命令对象
4. */
5. private Command command = null;
6. /**
7. * 构造方法
8. */
9. public Invoker(Commandcommand){
10. this.command = command;
11. }
12. /**
13. * 行动方法
14. */
15. public void action(){
16.
17. command.execute();
18. }
19.}
客户端角色类
1. public class Client {
2.
3. public static void main(String[] args) {
4. //创建接收者
5. Receiver receiver = new Receiver();
6. //创建命令对象,设定它的接收者
7. Command command = newConcreteCommand(receiver);
8. //创建请求者,把命令对象设置进去
9. Invoker invoker = new Invoker(command);
10. //执行方法
11. invoker.action();
12. }
13.
14.}