一、命令模式是什么?
命令模式是一种行为型的软件设计模式,行为请求者通过发起命令,使得行为实现者执行命令要求的行为。通常行为请求者和行为实现者之间是强耦合的,而命令模式能很好地将其解耦。
命令模式的优点:
- 解耦。行为请求者和实现者之间的强耦合关系解除。
- 良好扩展性。扩展命令只需要添加一个子类即可,满足开闭原则。
- 有效管理命令。如记录、撤销、组合等。
命令模式的缺点:
- 命令增加,子类数量也增多。
二、命令模式
2.1 结构图
客户端即Main主函数,调用者发起命令至接收者。
2.2 代码示例
场景描述:指挥部向独立团下达冲锋命令,向钢七连下达撤退命令。
//Command.h /****************************************************/ #pragma once #include <iostream> #include <unordered_map> #include <vector> #include <list> #include <string> using namespace std; // 定义接收者-军队 class Army { public: // 构造函数 Army(string name) : m_name(name) { } // 获取部队名 string getName() { return m_name; } // 行动 void fight() { cout << m_name << "发起冲锋!" << endl; } // 撤退 void retreat() { cout << m_name << "战略撤退!" << endl; } private: string m_name; }; // 定义命令接口 class Command { public: // 执行 virtual void execute() = 0; }; // 定义具体命令-战斗 class FightCommand : public Command { public: // 构造函数 FightCommand(Army* army) : m_army(army) { cout << "战斗命令部署:" << army->getName() << endl; } // 设置命令执行部队 void setArmy(Army* army) { cout << "战斗命令部署:" << army->getName() << endl; m_army = army; } // 执行 virtual void execute() { cout << "战斗执行!" << endl; m_army->fight(); } private: Army* m_army; }; // 定义具体命令-撤退 class RetreatCommand : public Command { public: // 构造函数 RetreatCommand(Army* army) : m_army(army) { cout << "撤退命令部署:" << army->getName() << endl; } // 设置命令执行部队 void setArmy(Army* army) { cout << "撤退命令部署:" << army->getName() << endl; m_army = army; } // 执行 virtual void execute() { cout << "撤退执行!" << endl; m_army->retreat(); } private: Army* m_army; }; // 定义调用者-指挥部 class Headquarters { public: // 设置命令 void setCommand(Command* command) { m_command = command; } // 执行命令 void execute_command() { m_command->execute(); } private: Command* m_command; };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Command.h" using namespace std; int main() { // 给两支部队分别部署两条命令 Army* army1 = new Army("独立团"); Command* command1 = new FightCommand(army1); Army* army2 = new Army("钢七连"); Command* command2 = new RetreatCommand(army2); // 指挥部发出命令:独立团冲锋、钢七连撤退 Headquarters* headquarters = new Headquarters(); headquarters->setCommand(command1); headquarters->execute_command(); headquarters->setCommand(command2); headquarters->execute_command(); // 清除 delete army1; delete command1; delete army2; delete command2; delete headquarters; army1 = nullptr; command1 = nullptr; army2 = nullptr; command2 = nullptr; headquarters = nullptr; return 0; }
程序结果如下。
命令模式的设计,使得指挥部和军队间的关系更加清晰、高效且利于维护和管理。假如没有命令模式,由指挥部直接安排军队,当命令种类增多时,指挥部类中的代码可能会出现膨胀和混乱,比如一堆if else或者switch,且很难进行命令的组合和撤销操作。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对命令模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解命令模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!