设计模式之命令模式-要听话!

一、命令模式的概念

命令模式是一种数据驱动的设计模式,属于行为型模式;请求以命令的形式包裹在对象中,并传递给调用对象;调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。

二、命令模式使用场景

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、使用命令模式可能会导致系统中出现很多的具体命令类。

能力有限,如有错误,多多指教。。。

发布了157 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/104504777