亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之命令模式

2020-01-26 15:16:23
字體:
來源:轉載
供稿:網友

前言

又要過年了,又是一個搶票季;從大學起,到現在工作,一直都是在外地,離家千里;以前買票,曾經也去火車站通宵排隊買票;直到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#中的委托也是使用命令模式去實現的。我在這里只是將我在學習過程中理解到的東西記錄了下來和大家分享??赡苡械牡胤轿业睦斫庖泊嬖诓铄e,希望大家和我分享你對命令模式的理解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频久久久久久久| 欧美精品video| 亚洲欧美国产制服动漫| 97视频免费看| 国产精品爱啪在线线免费观看| 热久久免费视频精品| 欧洲成人在线视频| 国产美女精彩久久| 91色视频在线观看| 国产亚洲精品久久久优势| 欧美日韩国产一中文字不卡| 视频在线一区二区| 亚洲第一网站免费视频| 色与欲影视天天看综合网| 国产精品一区专区欧美日韩| 久久精品国产2020观看福利| 国产精品欧美激情在线播放| 日韩av电影中文字幕| 欧美日韩黄色大片| 欧美高清自拍一区| 欧美日韩黄色大片| 国产成人久久久精品一区| 国产精品偷伦视频免费观看国产| 国产不卡精品视男人的天堂| 日韩综合中文字幕| 久久久国产视频91| 91网站在线免费观看| 色偷偷88888欧美精品久久久| 伦理中文字幕亚洲| 国产精品丝袜白浆摸在线| 国产亚洲视频中文字幕视频| 亚洲精品在线观看www| 92福利视频午夜1000合集在线观看| 欧美视频13p| 青青草原成人在线视频| 亚洲综合最新在线| 久久久精品在线观看| 精品无人国产偷自产在线| 中文在线资源观看视频网站免费不卡| 日韩一区二区精品视频| 正在播放欧美视频| 夜夜嗨av一区二区三区免费区| 国产精品高潮呻吟久久av黑人| 国产欧美婷婷中文| 17婷婷久久www| 日韩在线观看电影| 亚洲电影成人av99爱色| 久久精品电影网| 日韩网站在线观看| 国产亚洲激情视频在线| 亚洲男人天堂手机在线| 国产精品69久久| 日韩激情av在线播放| 国产日产亚洲精品| 久久精品欧美视频| 欧美日韩在线一区| 中文字幕亚洲精品| 欧美激情精品久久久久久免费印度| 久久国内精品一国内精品| 欧美色xxxx| 亚洲国内高清视频| 亚洲色图五月天| 91在线中文字幕| 久久网福利资源网站| 久久人人爽亚洲精品天堂| 欧美激情视频免费观看| 91探花福利精品国产自产在线| 国产激情久久久久| 在线国产精品播放| 91国内精品久久| 久久久人成影片一区二区三区观看| 亚洲久久久久久久久久| 日本不卡高字幕在线2019| 精品国产精品三级精品av网址| 日韩国产欧美精品一区二区三区| 欧美激情久久久久久| 亚洲欧美国产另类| 亚洲欧美国产另类| 国产成人黄色av| 日韩综合视频在线观看| 欧美超级免费视 在线| 亚洲人成网站777色婷婷| 国内伊人久久久久久网站视频| 精品国产一区av| 欧美国产精品va在线观看| 久久手机免费视频| 日本欧美爱爱爱| 国产高清在线不卡| 国语对白做受69| 久久精品久久久久久| 国产亚洲a∨片在线观看| 久久久国产91| 日韩欧美极品在线观看| 最近中文字幕mv在线一区二区三区四区| 97在线精品国自产拍中文| 欧美国产第一页| 中国人与牲禽动交精品| 国产成人拍精品视频午夜网站| 欧美高清理论片| 日韩欧美国产视频| 欧美在线视频免费播放| 亚洲无亚洲人成网站77777| 亚洲美女性视频| 热re91久久精品国99热蜜臀| 欧美午夜精品久久久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 国内成人精品视频| 亚洲人成电影网站色…| 91久久久久久久久久久| 欧美一级高清免费播放| 中文字幕国产亚洲2019| 日本91av在线播放| 亚洲欧美激情四射在线日| 久久成人精品一区二区三区| 亚洲专区国产精品| 久久成人这里只有精品| 欧美视频免费在线观看| 日韩欧美国产免费播放| 中文字幕日韩在线视频| 国产精品第一第二| 啪一啪鲁一鲁2019在线视频| 久久91超碰青草是什么| 国产精品一区二区久久久| 日韩精品在线看| 美日韩精品免费观看视频| 欧美性理论片在线观看片免费| 国模视频一区二区三区| 久久久精品久久久| 91色精品视频在线| 黄色精品一区二区| 欧美日韩一区二区免费在线观看| 国产一区二区三区视频在线观看| 成人精品一区二区三区电影免费| 亚洲色图日韩av| 91性高湖久久久久久久久_久久99| 精品国产一区二区三区久久狼5月| 中文字幕欧美日韩| 国产精品女人久久久久久| 中文字幕亚洲专区| 精品久久久久久亚洲精品| 97久久久免费福利网址| 97免费视频在线播放| 欧美三级免费观看| 日韩精品在线视频观看| 久久国产精品久久久久| 色综合视频一区中文字幕| 精品福利一区二区| 日本一区二区在线免费播放| 欧美高跟鞋交xxxxxhd| 国产欧美日韩免费看aⅴ视频| 精品高清一区二区三区| 亚洲国产精品久久久久久| 亚洲国产精品字幕| 日韩av在线高清| 国产精品一区二区久久国产| 日本a级片电影一区二区| 国产精品久久久久影院日本| 亚洲一区二区三区四区视频| 午夜剧场成人观在线视频免费观看| 日本免费久久高清视频| 久久夜精品va视频免费观看| 亚洲日韩欧美视频一区| 91久久久久久| 九九热这里只有在线精品视|