设计模式--命令模式

博客介绍了命令模式相关内容,包含客户、命令接收者、执行者接口、实际执行者、命令接口等角色。客户只需向命令接收者发出命令,无需知晓具体执行者和执行方式,体现高内聚。还提到可增加“Undo”命令实现状态变更。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解释说明:

main(),客户 

CInvoker,命令接收者,如项目经理 

IGroup,执行者接口 

CRequirementGroup,实际执行者之一

CPageGroup,实际执行者之二

CCodePage,实际执行者之三

ICommand,命令接口

CAddRequirementCommand,Execute函数,将调用CRequirementGroup的多个命令。来组合执行用户发出的命令。

CDeletePageCommand,同上

... ... 其它命令。

说明:客户只需要知道向Invoker发出命令(多个命令),而不是将命令直接传达给具体的执行者。当然,客户是需要知道都有什么命令的。 

注意:客户只发命令,不需要知道由谁来执行和怎么执行,体现出高内聚的特点。用户在发出命令后,是允许撤回的,所以可以增加一个命令“Undo ”,Undo是状态的变更。

 


#include <iostream>

using namespace std;

//执行抽象基类
class CGroup
{
public:
	CGroup(){}
	virtual ~CGroup(){}

	virtual void Find() = 0;
	virtual void Add() = 0;
	virtual void Delete() = 0;
	virtual void Plan() = 0;
};
//实际执行者1
class CRequirementGroup :public CGroup
{
public:
	CRequirementGroup(){}
	~CRequirementGroup(){}


	void Find()
	{
		cout << "找到需求组..." << endl;
	}
	void Add()
	{
		cout << "客户要求增加一项需求..." << endl;
	}
	void Delete()
	{
		cout << "要求删除一项需求..." << endl;
	}
	void Change()
	{
		cout << "客户要求修改一项需求..." << endl;
	}
	void Plan()
	{
		cout << "客户要求需求变更计划..." << endl;
	}
};
//实际执行者2
class CpageGroup :public CGroup
{
public:
	CpageGroup(){}
	~CpageGroup(){}

	void Find()
	{
		cout << "找到美工组..." << endl;
	}
	void Add()
	{
		cout << "客户要求增加一个页面..." << endl;
	}
	void Delete()
	{
		cout << "客户要求删除一个页面..." << endl;
	}
	void Change()
	{
		cout << "客户要求修改一个页面..." << endl;
	}
	void Plan()
	{
		cout << "客户要求页面变更计划..." << endl;
	}
};
//实际执行者3
class CCodeGroup :public CGroup
{
public:
	CCodeGroup(){}
	~CCodeGroup(){}

	void Find()
	{
		cout << "找到代码组..." << endl;
	}
	void Add()
	{
		cout << "客户要求增加一项功能..." << endl;
	}
	void Delete()
	{
		cout << "客户要求删除一项功能..." << endl;
	}
	void Change()
	{
		cout << "客户要求修改一项功能..." << endl;
	}
	void Plan()
	{
		cout << "客户要求代码变更计划..." << endl;
	}
};


//命令接口抽象基类
class CCommand
{
public:
	CCommand()
	{
		m_prg = new CRequirementGroup();
		m_ppg = new CpageGroup();
		m_pcg = new CCodeGroup();
	}
	virtual ~CCommand()
	{
		delete m_prg;
		delete m_ppg;
		delete m_pcg;
	}

	virtual void Execute() = 0;
protected:
	CRequirementGroup* m_prg;//可以执行某些操作
	CpageGroup* m_ppg;//可以执行另外一类操作
	CCodeGroup* m_pcg;//可以执行特殊操作

};

//添加执行命令
class CAddRequirementCommand :public CCommand
{
public:
	CAddRequirementCommand(){}
	~CAddRequirementCommand(){}

	void Execute()
	{
		//执行查找另一项需求的命令
		this->CCommand::m_prg->Find();
		
		//增加一份需求
		this->CCommand::m_prg->Add();

		//给出计划
		this->CCommand::m_prg->Plan();
	}
};
//删除撤销命令
class CDeletePageCommand :public CCommand
{
public:
	CDeletePageCommand(){}
	~CDeletePageCommand(){}

	void Execute()
	{
		this->CCommand::m_ppg->Find();
		this->CCommand::m_ppg->Delete();
		this->CCommand::m_ppg->Plan();
	}
};
//命令接收者
class CInvoker
{
public:
	CInvoker(){}
	~CInvoker(){}
	
	void SetCommand(CCommand* pcommand)
	{
		this->m_pCommand = pcommand;
	}

	void Action()
	{
		this->m_pCommand->Execute();
	}

private:
	CCommand* m_pCommand;
};

void doit()
{
	cout << "----------客户想增加一个需求----------" << endl;
	//申请一个
	CGroup* rg = new CRequirementGroup();
	rg->Find();
	rg->Add();
	rg->Plan();
	delete rg;
	cout << endl;
	cout << "----------客户又想修改一个页面----------" << endl;
	CGroup* cg = new CCodeGroup();
	cg->Find();
	cg->Add();
	cg->Plan();
	delete cg;
	cout << endl;
}

void donew()
{
	cout << "----------客户觉得烦了,希望只找一个人,并告诉他要做什么----------" << endl;
	cout << "----------客户要求增加一项需求----------" << endl;
	CInvoker gary;
	CCommand* pcommand = new CAddRequirementCommand();
	gary.SetCommand(pcommand);
	gary.Action();
	delete pcommand;
	cout << endl;
	//客户想要改动只需要找CInvoker就可以了。
	cout << "----------客户要求删除一个页面----------" << endl;
	CInvoker ricky;
	CCommand* pcommand2 = new CDeletePageCommand();
	ricky.SetCommand(pcommand2);
	ricky.Action();
	delete pcommand2;
	cout << endl;
}
int main()
{
	//客户原来的运行流程
	doit();
	cout << endl;
	donew();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值