命令模式

命令模式的优点

  1. 命令模式使新的命令很容易地被加入到系统里
  2. 允许请求接收的一方决定是否要否决请求
  3. 能容易地设计一个命令队列
  4. 可以容易地实现请求的undo与redo
  5. 在需要的情况下,可以较容易地将命令记入日志

命令模式的角色

涉及到5个角色

  1. 客户角色:创建一个具体命令对象,并确定接收者
  2. 命令角色:声明一个给所有具体命令类的抽象接口
  3. 具体命令:定义一个接受者和行为之间的弱耦合;实现execute()执行方法,复制调用接收者的相应操作
  4. 请求者:负责调用命令对象执行请求,相关方法较行为方法action()
  5. 接收者:负责具体实施和执行一个请求。任何类都可以成为接收者,实施和执行的请求较行动方法

角色的代码如下

命令角色

1
2
3
4
5
6
7
8
9
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
* 命令接口角色
*/
public interface Command {
void execute();
}

具体命令角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
* 具体命令实现
*/
public class ConcreteCommand implements Command {
//命令接受者
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public Receiver getReceiver() {
return receiver;
}
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
}
//命令调用接收者的行为
@Override
public void execute() {
receiver.action();
}
}

接收者

1
2
3
4
5
6
7
8
9
10
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
* 命令接收者
*/
public interface Receiver {
void action();
}
1
2
3
4
5
6
7
8
9
10
11
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
*/
public class ConcreteReceiver implements Receiver {
@Override
public void action() {
System.out.println("action has been taken.");
}
}

请求者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
* 请求者
*/
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
command.execute();
}
}

客户角色

1
2
3
4
5
6
7
8
9
10
11
12
13
package cai.pattern.command;
/**
* Created by caiyl on 2018/6/9.
*/
public class Client {
public static void main(String[] args) {
Receiver receiver = new ConcreteReceiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}

代码链接