让程序通畅运行-命令模式
模式简介
定义:将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化:对请求排队或者记录请求日志,以及支持可撤销操作
使用场景
- 需要抽象出等待执行的动作,然后以参数的形式提供出来–类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。
- 在不同的时刻指定、排列和执行请求。一个命令对象可以有与出事请求无关的生存期。
- 需要支持取消操作
- 支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍
- 需要支持事务操作
简单实现
接收者角色 俄罗斯方块游戏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package CommandMode;
public class TetrisMachine {
public void toLeft(){
System.out.println("向左");
}
public void toRight(){
System.out.println("向右");
}
public void fastToBottom(){
System.out.println("快速落下");
}
public void transfrom(){
System.out.println("改变形状");
}
}
|
命令者抽象 定义执行方法
1
2
3
4
5
|
package CommandMode;
public interface Command {
void execute();
}
|
具体命令者 向左移命令
1
2
3
4
5
6
7
8
9
10
11
12
|
package CommandMode;
public class LeftCommand implements Command {
private TetrisMachine tetrisMachine;
public LeftCommand(TetrisMachine tetrisMachine){
this.tetrisMachine=tetrisMachine;
}
public void execute() {
tetrisMachine.toLeft();
}
}
|
具体命令者 向右移命令
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package CommandMode;
public class RightCommand implements Command {
private TetrisMachine tetrisMachine;
public RightCommand(TetrisMachine tetrisMachine) {
this.tetrisMachine = tetrisMachine;
}
public void execute() {
tetrisMachine.toRight();
}
}
|
**具体命令者 快速落下的命令类
**
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package CommandMode;
public class FallCommand implements Command {
private TetrisMachine machine;
public FallCommand(TetrisMachine machine) {
this.machine = machine;
}
public void execute() {
machine.fastToBottom();
}
}
|
测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package CommandMode;
public class Client {
public static void main(String[] args) {
TetrisMachine tetrisMachine=new TetrisMachine();
LeftCommand leftCommand=new LeftCommand(tetrisMachine);
RightCommand rightCommand=new RightCommand(tetrisMachine);
FallCommand fallCommand=new FallCommand(tetrisMachine);
TransfromCommand transfromCommand=new TransfromCommand(tetrisMachine);
Buttons buttons=new Buttons();
buttons.setLeftCommand(leftCommand);
buttons.setRightCommand(rightCommand);
buttons.setTransfromCommand(transfromCommand);
buttons.setFallCommand(fallCommand);
buttons.fall();
buttons.toLeft();
buttons.toRight();
buttons.transfrom();
}
}
|
执行结果

总结
命令模式中充分体现了几乎所有设计模式的通病,就是类的膨胀,大量衍生类的创建,这是一个不可避免的问题,但是,它给我们带来的好处也非常多,更弱的耦合性、更灵活的控制性以及更好的拓展性,不过,在实际开发过成功是不是需要采用命令模式还是需要斟酌