[学习笔记]设计模式之Command(二)
ction();
20 int height = askHeight();
21
22 if (direction && height > 0) {
23 _drive->kick(direction, height);
24 }
25 }
复制代码
这样一来,我们的传感器就可以通过接收并调用命令来使得小人偶动起来了:
复制代码
1 // ... Sensor Process ...
2 ArmDrive* arm = ArmDrive::getInstance();
3 LegDrive* leg = LegDrive::getInstance();
4 Command* aCommand = new PunchCommand(arm);
5 aCommand->execute(); // execute command.
6 delete aCommand;
7 aCommand = new KickCommand(leg);
8 aCommand->execute(); // execute command.
复制代码
Command模式的好处还不仅限于此。大家一定熟悉批处理、宏等概念吧。结合Composite设计模式(请见索引),我们可以设计MacroCommand,从而批量执行一系列的命令。而对于MarcroCommand本身来说,它也无需要知道其各个子命令的具体执行者,因为它只需调用子命令即可。它具有add和remove方法来管理子命令。
复制代码
1 // ... Macro Command ...
2 class MacroCommand : public Command {
3 public:
4 MacroCommand();
5 virtual ~MacroCommand();
6
7 virtual void add(Command*);
8 virtual void remove(Command*);
9
10 virtual void execute();
11 private:
12 List* _cmds;
13 };
14
15 void MacroCommand::execute() {
16 ListIterator i (_cmds);
17
18 for (i.first(); !i.isDone(); i.next()) {
19 Command* c = i.currentItem();
20 c->execute();
21 }
22 }
23
24 void MacroCommand::add (Command* c) {
25 _cmds->append(c);
26 }
27
28 void MacroCommand::remove(Command* c) {
29 _cmds->remove(c);
30 }
复制代码
举例来看,我们想让小人偶打出一系列拳脚组合的“连招”:
复制代码
1 // ... Punch Punch Kick and Punch ...
2 MacroCommand* aMCmd = new MacroCommand();
3 aMCmd->add(new PunchCommand(arm));
4 aMCmd->add(new PunchCommand(arm));
5 aMCmd->add(new KickCommand(leg));
6 aMCmd->add(new PunchCommand(arm));
7 aMCmd->execute();