C++設計形式之敕令形式。本站提示廣大學習愛好者:(C++設計形式之敕令形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之敕令形式正文
媒介
又要過年了,又是一個搶票季;從年夜學起,到如今任務,一向都是在外埠,離家千裡;之前買票,已經也去火車站徹夜列隊買票;直到12306的騰空湧現,在電腦前一直止的點著鼠標刷票,誰人時刻12306很是軟弱,搶一張票更是難上加難;如今好了,漸漸壯大的12306,買票時湧現了一個列隊體系,先買票,進入12306的列隊體系;然後,體系一個一個的處置年夜家的要求,一旦你的購票要求進入了列隊體系,你就沒法再次停止刷票了,除非你加入列隊體系;這就削減了購票者的刷票次數;削減了12306後台辦事器的處置壓力。那末,你有無想過,12306是若何將你的購票要求參加列隊體系的呢?如許的列隊體系是若何完成的呢?而我明天總結的敕令形式,將會對此停止簡略的分析。
甚麼是敕令形式?
在GOF的《設計形式:可復用面向對象軟件的基本》一書中對敕令形式是如許說的:將一個要求封裝為一個對象,從而使你可用分歧的要求對客戶停止參數化;對要求列隊或記載要求日記,和支撐可撤消的操作。在OOP中,一切都是對象,將要求封裝成對象,相符OOP的設計思惟,當將客戶的單個要求封裝成對象今後,我們便可以對這個要求存儲更多的信息,使要求具有更多的才能;敕令形式異樣可以或許把要求發送者和吸收者解耦,使得敕令發送者不消去關懷要求將以何種方法被處置。
我們在12306上,單擊購票,這是一個要求,12306將這個要求封裝為一個對象,在12306還沒有上線列隊體系時,你買票是如許的:你一直的用鼠標點擊12306網站上的購票按鈕,直到你買到了票;關於你的每次點擊,辦事器都要停止處置,做出呼應,告知你,有無買到票;如許,能夠就會湧現許多次有效的點擊,然則這些有效的點擊卻增長了辦事器的累贅。增長了列隊體系今後,你的購票要求就進入了對應的購票隊列,一旦你進入了購票隊列,當你再次鼠標單擊購票時,12306會謝絕你的購票要求,它會告知你,你曾經進入了購票隊列;處於購票隊列中的你,你可以選擇加入購票隊列去購置其它車次的車票,從而進入其它購票隊列。如許就有用的削減了購票者發送許多有效的購票要求。
這就比如票是同享資本,誰都想要,然則票的數目是必定的;在沒有列隊體系之前,年夜家的購票要求都是去競爭這個票,辦事器關於年夜家關於同享資本——票的競爭停止互斥,誰搶到了,票就少一張;而如今有了購票隊列今後,年夜家都不消去競爭了,按時光的前後次序排好隊,12306把票一張張的發給進入隊列的購票者。
UML類圖
Command:聲明履行操作的接口;
ConcreteCommand:將一個吸收者對象綁定於一個舉措,以後,挪用吸收者響應的操作,以完成Execute來完成響應的敕令;
Client:創立一個詳細敕令對象,然則並沒有設定它的吸收者;
Invoker:請求該敕令履行這個要求;
Receiver:曉得若何實行與履行一個要求相干的操作,任何類都能夠作為一個吸收者。
以上這些對象是依照上面的方法停止協作的:
1.Client創立一個ConcreteCommand敕令對象,並指定它的Receiver對象;
2.Invoker對象存儲該ConcreteCommand對象;
3.該Invoker經由過程挪用Command對象的Execute操作來提交一個要求。假如這個敕令要求是可以撤消的,ConcreteCommand就履行Execute操作之前存儲以後狀況以用於撤消該敕令要求;
4.ConcreteCommand對象挪用Receiver的一些操作以履行該要求。
應用場所
應用敕令形式完成12306(工程下載):
CHomePage類,表現12306的官網訂票頁面;
C12306Processor類,是後台真正處置用戶的要求的類,專門停止出票;
Command類,表現用戶的購票敕令要求;
Customer類,表現購票的用戶。
因為代碼較多,這裡只供給工程的下載。
這裡再供給敕令形式的普通完成:
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
class Receiver
{
public:
void Action()
{
cout<<"Receiver->Action"<<endl;
}
};
class Command
{
public:
virtual void Execute() = 0;
};
class ConcreteCommand : public Command
{
public:
ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){}
void Execute()
{
m_pReceiver->Action();
}
private:
Receiver *m_pReceiver;
};
class Invoker
{
public:
Invoker(Command *pCommand) : m_pCommand(pCommand){}
void Invoke()
{
m_pCommand->Execute();
}
private:
Command *m_pCommand;
};
int main()
{
Receiver *pReceiver = new Receiver();
Command *pCommand = new ConcreteCommand(pReceiver);
Invoker *pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
SAFE_DELETE(pInvoker);
SAFE_DELETE(pCommand);
SAFE_DELETE(pReceiver);
return 0;
}
總結
敕令形式是一個很經典的形式,我的懂得也不會很到位;在我們的身旁,就存在許多的應用敕令形式的例子,數據庫中的事務就是應用敕令形式去完成的,在C#中的拜托也是應用敕令形式去完成的。我在這裡只是將我在進修進程中懂得到的器械記載了上去和年夜家分享。能夠有的處所我的懂得也存在錯誤,願望年夜家和我分享你對敕令形式的懂得。