设计模式之-行为型-命令模式
# 概述
命令模式是一种行为性设计模式,它将请求封装成对象,从而使您可以以参数化的方式使用这些请求。命令模式使得可以对请求进行队列、日志或支持可撤销操作的功能。
# 角色
命令模式主要由以下几个部分组成:
- 命令接口(Command):声明执行操作的接口。
- 具体命令(ConcreteCommand):实现命令接口,定义了与接收者之间的绑定关系,调用接收者的方法来实现请求。
- 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
- 调用者(Invoker):把命令对象放入队列,并在需要时执行这些命令。
- 客户端(Client):创建一个具体命令对象并设置其接收者。
# 使用场景
- 当希望将请求调用者与请求接收者解耦时。
- 如果需要实现可撤销操作时。
- 需要支持请求的队列或日志时。
# 代码示例
// 命令接口
interface Command {
void execute();
}
// 具体命令
class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
// 具体命令
class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
// 接收者
class Light {
public void turnOn() {
System.out.println("The light is on.");
}
public void turnOff() {
System.out.println("The light is off.");
}
}
// 调用者
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Light light = new Light();
Command lightOn = new LightOnCommand(light);
Command lightOff = new LightOffCommand(light);
RemoteControl remote = new RemoteControl();
// 打开灯
remote.setCommand(lightOn);
remote.pressButton();
// 关闭灯
remote.setCommand(lightOff);
remote.pressButton();
}
}
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 总结
命令模式通过将请求封装为对象,提供了灵活的请求处理机制。它减少了请求发送者和接收者之间的耦合关系,使得可以灵活地处理请求、执行和撤销操作。理解和掌握命令模式对于实现操作的队列、日志记录和撤销功能具有重要意义。
最后更新时间: 2024/12/26, 17:56:54