Command:Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.把請求封裝起來,這樣就可以按照顧客的需要把顧客的請求作爲參數,封裝起來,並且可以撤銷請求;
這是一個處理參數的設計模式,也就是原本的參數是固定的,但是現在變成了可變的參數;
這個和qt的信號和槽很像,發送的參數可以不同,但是類型是一樣的,然後接受參數的進行動作;也就是和事件機制,回調函數等類似;也就是ConcreteCommand中有自己的receiver列表,存儲了多個receiver;
CommandPatternTest.h:
#pragma once
#include<iostream>
#include<vector>
class Receiver
{
public :
Receiver()
{
std::cout << "base receiver\n";
}
virtual void Action()
{
std::cout << "bace receiver action\n";
}
virtual ~Receiver()
{
std::cout << "base receiver release\n";
}
};
class CommandPatternTest
{
public :
virtual void Execute()
{
}
virtual void AddReceiver(Receiver receiver)
{
}
};
class ConcreteReceiver : public Receiver
{
public:
ConcreteReceiver()
{
std::cout << "ConcreteReceiver\n";
}
void Action()
{
std::cout << "ConcreteReceiver action\n";
}
~ConcreteReceiver()
{
std::cout << "ConcreteReceiver release\n";
}
};
class ConcreteCommand : public CommandPatternTest
{
public:
void Execute()
{
/*for (auto receiver : receiver_list_)
{
std::cout << "action\n";
receiver.Action();
} */
for (int i = 0; i < receiver_list_.size(); i++)
{
receiver_list_[i]->Action();
}
}
void AddReceiver(Receiver* receiver)
{
std::cout << "add receiver\n";
//receiver.Action();
receiver_list_.push_back(receiver);
}
private:
std::vector<Receiver*> receiver_list_;
};
main:
#include"CommandPatternTest.h"
int main()
{
ConcreteReceiver receiver;
ConcreteCommand command;
command.AddReceiver(&receiver);
command.Execute();
return 0;
}
結果: