作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
一、命令模式是什么?
命令模式是一种行为型的软件设计模式,行为请求者通过发起命令,使得行为实现者执行命令要求的行为。通常行为请求者和行为实现者之间是强耦合的,而命令模式能很好地将其解耦。
命令模式的优点:
- 解耦。行为请求者和实现者之间的强耦合关系解除。
- 良好扩展性。扩展命令只需要添加一个子类即可,满足开闭原则。
- 有效管理命令。如记录、撤销、组合等。
命令模式的缺点:
- 命令增加,子类数量也增多。
二、命令模式
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,且很难进行命令的组合和撤销操作。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对命令模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解命令模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!