|
|
@@ -1415,4 +1415,54 @@ int main(){
|
|
|
2. 应用了职责链模式后,对象的职责分配将更具灵活性。可以动态添加、修改请求的处理职责
|
|
|
3. 如果请求到职责链末尾仍没有被处理,应该有一个缺省机制来处理这种请求
|
|
|
|
|
|
-### 命令模式
|
|
|
+### 命令模式
|
|
|
+
|
|
|
+命令模式将请求行为封装成对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
|
|
|
+
|
|
|
+```cpp
|
|
|
+class Command
|
|
|
+{
|
|
|
+ public:
|
|
|
+ virtual void execute() = 0;
|
|
|
+};
|
|
|
+
|
|
|
+class ConcreteCommand_1 : public Command
|
|
|
+{
|
|
|
+ std::string arg;
|
|
|
+
|
|
|
+ public:
|
|
|
+ virtual void execute() override
|
|
|
+ {
|
|
|
+ // 1号操作
|
|
|
+ }
|
|
|
+};
|
|
|
+class ConcreteCommand_2 : public Command
|
|
|
+{
|
|
|
+ std::string arg;
|
|
|
+
|
|
|
+ public:
|
|
|
+ virtual void execute() override
|
|
|
+ {
|
|
|
+ // 2号操作
|
|
|
+ }
|
|
|
+};
|
|
|
+class MacroCommand : public Command // 组合操作
|
|
|
+{
|
|
|
+ vector<Command *> commands;
|
|
|
+
|
|
|
+ public:
|
|
|
+ void addCommand(Command *c) { commands.push_back(c); }
|
|
|
+ void execute() override
|
|
|
+ {
|
|
|
+ for (auto &c : commands)
|
|
|
+ {
|
|
|
+ c->execute();
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+> [游戏设计模式中对命令模式的解释](https://gpp.tkchu.me/command.html)
|
|
|
+
|
|
|
+1. 命令模式的根本目的在于将**行为请求者**与**行为实现者**解耦,在面下搞对象语言中,常见的实现手段使**将行为抽象为对象**
|
|
|
+2. 实现命令模式接口的具体命令对象有时候根据需要可能保存一些额外的状态信息,通过组合模式可以将多个命令封装为一个复合命令
|