设计模式之命令模式-要听话!
一、命令模式的概念
命令模式是一种数据驱动的设计模式,属于行为型模式;请求以命令的形式包裹在对象中,并传递给调用对象;调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。
二、命令模式使用场景
1、命令模式是将一个请求封装为一个对象,从而可用不同的请求对客户端进行参数化、对请
求排队或记录请求日志、支持可撤销的操作等等。
三、命令模式构建方法
1、命令抽象类(Command)
命令抽象父类给具体实现类提供统一的共同接口和方法。
2、命令具体实现类(ConcreteCommand)
命令具体实现类继承抽象父类,用于实现抽象父类中的共同接口和方法。
3、接收者类(Receiver)
需要被调用的目标对象类
4、命令对象入口类或者调用者类(Invorker)
通过命令对象入口类来执行命令对象
四、命令模式的示例
// CommandPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
namespace TYPES
{
enum COMMANDTYPE
{
EXPRESS, // 取快递
WASH, // 洗碗
COOK // 做饭
};
}
// 丈夫是接收者-TOBY
class Husband
{
public:
void setCommand(TYPES::COMMANDTYPE commandType) // 丈夫的话形同“虚”设,还要看媳妇脸色
{
switch (commandType)
{
case TYPES::EXPRESS:
cout << "Toby去取快递。。。" << endl;
break;
case TYPES::WASH:
cout << "Toby去洗碗。。。" << endl;
break;
case TYPES::COOK:
cout << "Toby去做饭。。。" << endl;
break;
default:
cout << "任性一回,不想做。" << endl;
break;
}
}
};
// 命令抽象类
class Command
{
public:
virtual void executeCommand() = 0;
private:
};
// 命令具体类-取快递
class ExpressCommand : public Command
{
public:
ExpressCommand(Husband *pHusband)
{
m_pHusband = pHusband;
}
virtual void executeCommand()
{
m_pHusband->setCommand(TYPES::COMMANDTYPE::EXPRESS);
}
private:
Husband *m_pHusband;
};
// 命令具体类-洗碗
class WashCommand : public Command
{
public:
WashCommand(Husband *pHusband)
{
m_pHusband = pHusband;
}
virtual void executeCommand()
{
m_pHusband->setCommand(TYPES::COMMANDTYPE::WASH);
}
private:
Husband *m_pHusband;
};
// 命令具体类-做饭
class CookCommand : public Command
{
public:
CookCommand(Husband *pHusband)
{
m_pHusband = pHusband;
}
virtual void executeCommand()
{
m_pHusband->setCommand(TYPES::COMMANDTYPE::COOK);
}
private:
Husband *m_pHusband;
};
// 媳妇是命令发送者
class Wife
{
public:
void setCommand(Command *pCommand)
{
m_pCommand = pCommand;
if (pCommand != nullptr)
{
m_pCommand->executeCommand();
}
return;
}
private:
Command *m_pCommand;
};
int main()
{
cout << "----------命令行模式----------" << endl;
Husband *pHusband = new Husband;
ExpressCommand *pExpressCommand = new ExpressCommand(pHusband);
WashCommand *pWashCommand = new WashCommand(pHusband);
CookCommand *pCookCommand = new CookCommand(pHusband);
Wife *pWife = new Wife;
pWife->setCommand(pExpressCommand);
pWife->setCommand(pWashCommand);
pWife->setCommand(pCookCommand);
DELETE_PTR(pWife);
DELETE_PTR(pExpressCommand);
DELETE_PTR(pWashCommand);
DELETE_PTR(pCookCommand);
DELETE_PTR(pHusband);
std::cout << "Hello World!\n";
getchar();
}
运行结果:
五、命令模式的优缺点
优点:
1、命令模式降低了系统耦合度。
2、可以很容易把新命令添加到系统中。
缺点:
1、使用命令模式可能会导致系统中出现很多的具体命令类。
原文:https://blog.csdn.net/toby54king/article/details/104504777