command命令模式
Command模式通過將請求封裝到一個對象(Command)中,並將請求的接收者存放到具體的ConcreteCommand類中的(reciver)中,從而實現叫用作業的對象和操作的具體實現之間的解耦。
解析:Command模式的思想是把命令封裝在一個類(Command)中,同時把接收對象也封裝在一個類(Receive)中,由調用這個命令的類(Invoker)來調用。其實,如果弄清楚了Command模式的原理,就會發現其實它和註冊回呼函數的原理很相似,而在面向過程的設計中的回呼函數其實和這裡的Command類的作用是一致的。採用Command模式解耦了命令的發出者和命令的執行者。
小demo
command.h
#ifndef COMMAND_H#define COMMAND_Hclass 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 ConcreateComand: public Command{public:ConcreateComand(Receiver* pReceiver);virtual ~ConcreateComand();virtual void Execute();private:Receiver* m_pReceiver;};#endif
command.cpp
#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 = NULL;}void Invoker::Invoke(){if (NULL != m_pCommand){m_pCommand->Execute();}}ConcreateComand::ConcreateComand(Receiver* pReceiver): m_pReceiver(pReceiver){}
main.cpp
#include "Command.h"#include <stdlib.h>int main(){Receiver* pReceiver = new Receiver();Command* pCommand = new ConcreateComand(pReceiver);Invoker* pInvoker = new Invoker(pCommand);pInvoker->Invoke();delete pInvoker;system("pause");return 0;}
Command模式的思想非常簡單,但是Command模式也十分常見,並且威力不小。實際上,command模式關鍵就是提供一個抽象的command類,並將執行操作封裝到command類介面中,command類中一般就只是一些介面的集合,並不包含任何的資料屬性。好處有:
1.command模式將叫用作業的對象和知道如何?該操作的對象解耦。在command的結構圖中,Invoker對象根本就不知道具體的是哪個對象在處理Excute操作(當然要知道是Command類別的對象,也僅此而已)。
2.在command要增加新的處理操作對象很容易,我們可以通過建立新的繼承自command的子類來實現這一點。
3.command模式可以喝memento模式結合起來,支援取消的操作。