一、前言:
命令模式的注意事项和细节:
将发起请求的对象与执行请求的对象解耦。发起请求的对象就是调用者,调用者只需调用命令对象的 execute() 方法就可以让接受者工作,而不必知道接受者具体是如何实现的。容易设计一个命令队列,只要把命令对象放入队列,就可以多线程的执行命令。容易实现对请求的撤销与重做。
二、命令模式:
2.1、UML 图:
2.2、代码实例:
Step 1) 创建 Command 接口:
public interface Command
{
public void execute();
public void undo();
}
Step 2) 创建 LightOnCommand 实现类:
public class LightOnCommand implements Command
{
LightReceive light
;
public LightOnCommand(LightReceive light
) {
this.light
= light
;
}
@Override
public void execute() {
light
.on();
}
@Override
public void undo() {
light
.off();
}
}
Step 3) 创建 LightOffCommand 实现类:
public class LightOffCommand implements Command
{
LightReceive light
;
public LightOffCommand(LightReceive light
) {
this.light
= light
;
}
@Override
public void execute() {
light
.off();
}
@Override
public void undo() {
light
.on();
}
}
Step 4) 创建 NoCommand 实现类:
public class NoCommand implements Command
{
@Override
public void execute() {
}
@Override
public void undo() {
}
}
Step 5) 创建 RemoteController 类:
public class RemoteController {
Command
[] onCommands
;
Command
[] offCommands
;
Command undoCommand
;
public RemoteController(){
onCommands
= new Command
[5];
offCommands
= new Command
[5];
for(int i
=0; i
<5; i
++){
onCommands
[i
] = new NoCommand();
offCommands
[i
] = new NoCommand();
}
}
public void setCommand(int no
, Command onCommand
, Command offCommand
){
onCommands
[no
] = onCommand
;
offCommands
[no
] = offCommand
;
}
public void onButtonWasPushed(int no
){
onCommands
[no
].execute();
undoCommand
= onCommands
[no
];
}
public void offButtonWasPushed(int no
){
offCommands
[no
].execute();
undoCommand
= offCommands
[no
];
}
public void undoButtonWasPushed(){
undoCommand
.undo();
}
}
Step 6) 创建 LightReceive 类:
public class LightReceive {
public void on(){
System
.out
.println("点灯打开了!");
}
public void off(){
System
.out
.println("点灯关闭了!");
}
}
Step 7) 创建 main 方法:
public class Client {
public static void main(String
[] args
) {
LightReceive lightReceive
= new LightReceive();
LightOnCommand lightOnCommand
= new LightOnCommand(lightReceive
);
LightOffCommand lightOffCommand
= new LightOffCommand(lightReceive
);
RemoteController remoteController
= new RemoteController();
remoteController
.setCommand(0, lightOnCommand
, lightOffCommand
);
System
.out
.println("---------------按下灯的开按钮-----------------");
remoteController
.onButtonWasPushed(0);
System
.out
.println("---------------按下灯的关按钮-----------------");
remoteController
.offButtonWasPushed(0);
System
.out
.println("---------------按下撤销按钮-----------------");
remoteController
.undoButtonWasPushed();
}
}
• 由 ChiKong_Tam 写于 2020 年 10 月 20 日