將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可復原的操作。

Execute(),具體命令綁定 Receiver 並實作執行邏輯。Execute(),不關心具體命令細節。#ifndef COMMAND_H
#define COMMAND_H
class Command {
public:
virtual ~Command() {}
virtual void Execute() = 0;
};
class Receiver {
public:
void Action();
};
class Invoker {
public:
Invoker(Command* pCommand);
~Invoker();
void Invoke();
private:
Command* m_pCommand;
};
class ConcreteCommand : public Command {
public:
ConcreteCommand(Receiver* pReceiver);
virtual ~ConcreteCommand();
virtual void Execute();
private:
Receiver* m_pReceiver;
};
#endif
#include "Command.h"
#include <iostream>
void Receiver::Action() { std::cout << "Receiver Action\n"; }
Invoker::Invoker(Command* pCommand) : m_pCommand(pCommand) {}
Invoker::~Invoker() { delete m_pCommand; m_pCommand = nullptr; }
void Invoker::Invoke() { if (m_pCommand) m_pCommand->Execute(); }
ConcreteCommand::ConcreteCommand(Receiver* pReceiver) : m_pReceiver(pReceiver) {}
ConcreteCommand::~ConcreteCommand() { delete m_pReceiver; m_pReceiver = nullptr; }
void ConcreteCommand::Execute() {
if (m_pReceiver) m_pReceiver->Action();
std::cout << "Execute by ConcreteCommand\n";
}
#include "Command.h"
#include <cstdlib>
int main() {
Receiver* pReceiver = new Receiver();
Command* pCommand = new ConcreteCommand(pReceiver);
Invoker* pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
delete pInvoker;
return 0;
}
Command 加入虛擬 Undo(),Invoker 維護命令堆疊(std::stack<Command*>)。Execute() 依序呼叫子命令,Undo() 逆序復原。