130 lines
2.7 KiB
Markdown
130 lines
2.7 KiB
Markdown
# 2. 命令(Command)
|
||
|
||
## Intent
|
||
|
||
将命令封装成对象中,具有以下作用:
|
||
|
||
* 使用命令来参数化其它对象
|
||
* 将命令放入队列中进行排队
|
||
* 将命令的操作记录到日志中
|
||
* 支持可撤销的操作
|
||
|
||
## Class Diagram
|
||
|
||
* Command:命令
|
||
* Receiver:命令接收者,也就是命令真正的执行者
|
||
* Invoker:通过它来调用命令
|
||
* Client:可以设置命令与命令的接收者
|
||
|
||
\
|
||
|
||
|
||
## Implementation
|
||
|
||
设计一个遥控器,可以控制电灯开关。
|
||
|
||
\
|
||
|
||
|
||
```java
|
||
public interface Command {
|
||
void execute();
|
||
}
|
||
```
|
||
|
||
```java
|
||
public class LightOnCommand implements Command {
|
||
Light light;
|
||
|
||
public LightOnCommand(Light light) {
|
||
this.light = light;
|
||
}
|
||
|
||
@Override
|
||
public void execute() {
|
||
light.on();
|
||
}
|
||
}
|
||
```
|
||
|
||
```java
|
||
public class LightOffCommand implements Command {
|
||
Light light;
|
||
|
||
public LightOffCommand(Light light) {
|
||
this.light = light;
|
||
}
|
||
|
||
@Override
|
||
public void execute() {
|
||
light.off();
|
||
}
|
||
}
|
||
```
|
||
|
||
```java
|
||
public class Light {
|
||
|
||
public void on() {
|
||
System.out.println("Light is on!");
|
||
}
|
||
|
||
public void off() {
|
||
System.out.println("Light is off!");
|
||
}
|
||
}
|
||
```
|
||
|
||
```java
|
||
/**
|
||
* 遥控器
|
||
*/
|
||
public class Invoker {
|
||
private Command[] onCommands;
|
||
private Command[] offCommands;
|
||
private final int slotNum = 7;
|
||
|
||
public Invoker() {
|
||
this.onCommands = new Command[slotNum];
|
||
this.offCommands = new Command[slotNum];
|
||
}
|
||
|
||
public void setOnCommand(Command command, int slot) {
|
||
onCommands[slot] = command;
|
||
}
|
||
|
||
public void setOffCommand(Command command, int slot) {
|
||
offCommands[slot] = command;
|
||
}
|
||
|
||
public void onButtonWasPushed(int slot) {
|
||
onCommands[slot].execute();
|
||
}
|
||
|
||
public void offButtonWasPushed(int slot) {
|
||
offCommands[slot].execute();
|
||
}
|
||
}
|
||
```
|
||
|
||
```java
|
||
public class Client {
|
||
public static void main(String[] args) {
|
||
Invoker invoker = new Invoker();
|
||
Light light = new Light();
|
||
Command lightOnCommand = new LightOnCommand(light);
|
||
Command lightOffCommand = new LightOffCommand(light);
|
||
invoker.setOnCommand(lightOnCommand, 0);
|
||
invoker.setOffCommand(lightOffCommand, 0);
|
||
invoker.onButtonWasPushed(0);
|
||
invoker.offButtonWasPushed(0);
|
||
}
|
||
}
|
||
```
|
||
|
||
## JDK
|
||
|
||
* [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)
|
||
* [Netflix Hystrix](https://github.com/Netflix/Hystrix/wiki)
|
||
* [javax.swing.Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/Action.html)
|