Technology-设计模式-命令模式

本文介绍了GoF中的命令模式。

模式推演

个遥控器有多个按钮,用来控制多个设备:

一个遥控器有多个按钮,每个按钮都是按下,或者松开状态,希望可以控制多个设备,并且可以随时进行替换。

首先,我们将变化部分独立出来,就是可以随时替换的控制命令,由于有很多种命令,所以先建立一个命令的基类。

1
2
3
public interface Command{
public void execute();
}

每个命令有一个调用者,就是控制器,有一个接收者,就是设备,将命令传递给控制器的就是用户。

Technology-DesignPattern-Command-Request

命令支持撤销,支持一次执行多个命令:

进一步,我们需要让命令支持撤销:

1
2
3
4
public interface Command{
public void execute();
public void undo();
}

支持一次执行多次命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MacroCommand implements Command {
Command[] commands;

public MacroCommand(Command[] commands){
this.commands = commands;
}

public void execute(){
for(Command command : commands){
command.execute();
}
}

public void undo(){
for(Command command : commands){
command.undo();
}
}
}

定义

命令模式(Command Pattern):将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

类图:

Technology-DesignPattern-Command-Class

典型例子

  • 队列请求:例如iOS中的GCD,每个block都是一个命令。
  • 日志请求:数据库的事务操作,一整群操作必须全部完成,或者全部撤销。