解释说明:
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;
}