命令模式(Command):將一個請求封裝為一個對象,從而使你可以不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
命令模式結構圖:
Command類,用來聲明執行操作的介面。
class Command
{
protected:
Receiver *receiver;
public:
Command(Receiver * receiver)
{
this->receiver = receiver;
}
virtual void Execute()=0;
};
ConcreteCommand類,將一個接收者對象綁定於一個動作,調用接收者相應的操作,以實現Execute。
class ConcreteCommand :public Command
{
public:
ConcreteCommand(Receiver * receiver):Command(recciver){}
void Execute()
{
receiver->Action();
}
};
Invoker類,要求該命令執行這個請求。
class Invoker
{
private:
Command * command;
public:
void SetCommand(Command * command)
{
this->command= command;
}
void ExecuteCommand()
{
command->Execute();
}
};
Receiver類,知道如何實施與執行一個與請求相關的操作,任何類都可能做為一個接收者。
class Receiver
{
public:
void Action()
{
cout<< “執行請求!”<<endl;
}
};
用戶端代碼,建立一個具體命令對象並設定它的接收者。
void main()
{
Receiver *r = new Receiver();
Command *c = new ConcreteCommand(r);
Invoker *I = new Invoker();
i->SetCommand(c);
i->ExecuteCommand();
}
命令模式作用:
1. 他能較容易地設計一個命令隊列;
2. 在需要的情況下,可以較容易地將命令記入日誌;
3. 允許接收請求的一方決定是否要否決請求
4. 可以容易地實現對請求的撤銷和重做;
5. 由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容量。