auto commit
This commit is contained in:
134
notes/设计模式 - 命令.md
Normal file
134
notes/设计模式 - 命令.md
Normal file
@ -0,0 +1,134 @@
|
||||
## 2. 命令(Command)
|
||||
|
||||
### Intent
|
||||
|
||||
将命令封装成对象中,具有以下作用:
|
||||
|
||||
- 使用命令来参数化其它对象
|
||||
- 将命令放入队列中进行排队
|
||||
- 将命令的操作记录到日志中
|
||||
- 支持可撤销的操作
|
||||
|
||||
### Class Diagram
|
||||
|
||||
- Command:命令
|
||||
- Receiver:命令接收者,也就是命令真正的执行者
|
||||
- Invoker:通过它来调用命令
|
||||
- Client:可以设置命令与命令的接收者
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/c44a0342-f405-4f17-b750-e27cf4aadde2.png"/> </div><br>
|
||||
|
||||
### Implementation
|
||||
|
||||
设计一个遥控器,可以控制电灯开关。
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/e6bded8e-41a0-489a-88a6-638e88ab7666.jpg"/> </div><br>
|
||||
|
||||
```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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>
|
Reference in New Issue
Block a user