青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

設計模式C++實現(5)——原型模式、模板方法模式 --- 轉

       軟件領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態,真正領悟設計 模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對于每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計 模式》和《設計模式:可復用面向對象軟件的基礎》(DP)兩本書。本文介紹原型模式和模板方法模式的實現。首先介紹原型模式,然后引出模板方法模式。

       DP書上的定義為:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。其中有一個詞很重要,那就是拷貝??梢哉f,拷貝是原型模式的精髓 所在。舉個現實中的例子來介紹原型模式。找工作的時候,我們需要準備簡歷。假設沒有打印設備,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷, 如果要修改簡歷中的某項,那么所有已寫好的簡歷都要修改,工作量很大。隨著科技的進步,出現了打印設備。我們只需手寫一份,然后利用打印設備復印多份即 可。如果要修改簡歷中的某項,那么修改原始的版本就可以了,然后再復印。原始的那份手寫稿相當于是一個原型,有了它,就可以通過復?。截悾﹦撛斐龈嗟?新簡歷。這就是原型模式的基本思想。下面給出原型模式的UML圖,以剛才那個例子為實例。


        原型模式實現的關鍵就是實現Clone函數,對于C++來說,其實就是拷貝構造函數,需實現深拷貝,下面給出一種實現。

  1. //父類  
  2. class Resume  
  3. {  
  4. protected:  
  5.     char *name;  
  6. public:  
  7.     Resume() {}  
  8.     virtual ~Resume() {}  
  9.     virtual Resume* Clone() { return NULL; }  
  10.     virtual void Set(char *n) {}  
  11.     virtual void Show() {}  
  12. };  
  1. class ResumeA : public Resume  
  2. {  
  3. public:  
  4.     ResumeA(const char *str);  //構造函數  
  5.     ResumeA(const ResumeA &r); //拷貝構造函數  
  6.     ~ResumeA();                //析構函數  
  7.     ResumeA* Clone();          //克隆,關鍵所在  
  8.     void Show();               //顯示內容  
  9. };  
  10. ResumeA::ResumeA(const char *str)   
  11. {  
  12.     if(str == NULL) {  
  13.         name = new char[1];   
  14.         name[0] = '\0';   
  15.     }  
  16.     else {  
  17.         name = new char[strlen(str)+1];  
  18.         strcpy(name, str);  
  19.     }  
  20. }  
  21. ResumeA::~ResumeA() { delete [] name;}  
  22. ResumeA::ResumeA(const ResumeA &r) {  
  23.     name = new char[strlen(r.name)+1];  
  24.     strcpy(name, r.name);  
  25. }  
  26. ResumeA* ResumeA::Clone() {  
  27.     return new ResumeA(*this);  
  28. }  
  29. void ResumeA::Show() {  
  30.     cout<<"ResumeA name : "<<name<<endl;   
  31. }  

          這里只給出了ResumeA的實現,ResumeB的實現類似。使用的方式如下:

  1. int main()  
  2. {  
  3.     Resume *r1 = new ResumeA("A");  
  4.     Resume *r2 = new ResumeB("B");  
  5.     Resume *r3 = r1->Clone();  
  6.     Resume *r4 = r2->Clone();  
  7.     r1->Show(); r2->Show();  
  8.     //刪除r1,r2  
  9.     delete r1; delete r2;     
  10.     r1 = r2 = NULL;  
  11.     //深拷貝所以對r3,r4無影響  
  12.     r3->Show(); r4->Show();  
  13.     delete r3; delete r4;  
  14.     r3 = r4 = NULL;  
  15. }  

       最近有個招聘會,可以帶上簡歷去應聘了。但是,其中有一家公司不接受簡歷,而是給應聘者發了一張簡歷表,上面有基本信息、教育背景、工作經歷等欄,讓應 聘者按照要求填寫完整。每個人拿到這份表格后,就開始填寫。如果用程序實現這個過程,該如何做呢?一種方案就是用模板方法模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。我們的例子中,操作就是填寫簡歷這一過程,我們可以在父類中定義操作的算法骨架,而具體的實現由子類完成。下面給出它的UML圖。

       其中FillResume() 定義了操作的骨架,依次調用子類實現的函數。相當于每個人填寫簡歷的實際過程。接著給出相應的C++代碼。

  1. //簡歷  
  2. class Resume  
  3. {  
  4. protected: //保護成員  
  5.     virtual void SetPersonalInfo() {}  
  6.     virtual void SetEducation() {}  
  7.     virtual void SetWorkExp() {}  
  8. public:  
  9.     void FillResume()   
  10.     {  
  11.         SetPersonalInfo();  
  12.         SetEducation();  
  13.         SetWorkExp();  
  14.     }  
  15. };  
  16. class ResumeA: public Resume  
  17. {  
  18. protected:  
  19.     void SetPersonalInfo() { cout<<"A's PersonalInfo"<<endl; }  
  20.     void SetEducation() { cout<<"A's Education"<<endl; }  
  21.     void SetWorkExp() { cout<<"A's Work Experience"<<endl; }  
  22. };  
  23. class ResumeB: public Resume  
  24. {  
  25. protected:  
  26.     void SetPersonalInfo() { cout<<"B's PersonalInfo"<<endl; }  
  27.     void SetEducation() { cout<<"B's Education"<<endl; }  
  28.     void SetWorkExp() { cout<<"B's Work Experience"<<endl; }  
  29. };  

        使用方式如下:

  1. int main()  
  2. {  
  3.     Resume *r1;  
  4.     r1 = new ResumeA();  
  5.     r1->FillResume();  
  6.     delete r1;  
  7.     r1 = new ResumeB();  
  8.     r1->FillResume();  
  9.     delete r1;  
  10.     r1 = NULL;  
  11.     return 0;  
  12. }  
           本人享有博客文章的版權,轉載請標明出處 http://blog.csdn.net/wuzhekai1985

posted on 2013-09-05 18:46 大龍 閱讀(330) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清不卡在线| 午夜亚洲性色福利视频| 久久久久网站| 久久久久九九视频| 久久九九99| 久久久久久伊人| 久久免费观看视频| 免费看成人av| 欧美日韩国产精品一区| 欧美亚一区二区| 国产欧美日韩| 亚洲成色777777女色窝| 亚洲日韩视频| 亚洲制服少妇| 免播放器亚洲| 亚洲欧洲精品天堂一级| 亚洲精选成人| 午夜精品免费视频| 久久午夜电影| 欧美三区在线视频| 国产原创一区二区| 一本久久综合| 久久久久久久一区二区三区| 欧美黄免费看| 亚洲一区精品视频| 欧美成人综合一区| 国产精品视频网站| 亚洲激情视频网| 欧美一级在线亚洲天堂| 欧美激情区在线播放| 亚洲欧美日韩国产综合精品二区| 久久影院午夜论| 国产精品大片wwwwww| 亚洲高清不卡在线观看| 欧美一区亚洲二区| 亚洲日韩视频| 另类尿喷潮videofree| 国产精品久久福利| 亚洲精品你懂的| 久久综合国产精品台湾中文娱乐网| 亚洲毛片av在线| 欧美成人综合网站| 亚洲大胆在线| 久久午夜电影网| 午夜精品国产| 国产精品视频xxxx| 欧美国产综合视频| 国产亚洲欧美一级| 欧美一区二区国产| 亚洲网址在线| 欧美视频一区在线观看| 91久久香蕉国产日韩欧美9色| 久久精品一二三区| 久久久久国色av免费看影院| 亚洲精品免费在线观看| 国产伦精品一区二区三区视频黑人| 亚洲高清二区| 狼狼综合久久久久综合网| 亚洲欧美国产另类| 国产精品一二三四| 午夜精品久久久久99热蜜桃导演| 亚洲精品乱码久久久久| 欧美h视频在线| 亚洲国产精品一区二区第四页av | 亚洲国内自拍| 免费成人网www| 久久久久免费视频| 亚洲第一在线| 亚洲成人在线免费| 国产一区二区三区在线观看精品 | 久久精品亚洲精品| 亚洲欧美一区二区三区久久| 国产精品视频yy9299一区| 亚洲欧美激情诱惑| 亚洲欧美成人一区二区在线电影 | 欧美剧在线免费观看网站| 99re66热这里只有精品4| 亚洲另类黄色| 国产精品国内视频| 欧美一区三区三区高中清蜜桃| 亚洲欧美视频一区| 亚洲国产经典视频| 一区二区福利| 国产一区二区三区在线播放免费观看| 久久综合亚州| 欧美女激情福利| 欧美资源在线观看| 美女精品国产| 亚洲欧美日韩国产中文在线| 性欧美大战久久久久久久久| 一区二区视频免费在线观看| 亚洲国产电影| 国产精品欧美日韩| 欧美成在线观看| 欧美日韩一区二区免费在线观看| 一区二区三区|亚洲午夜| 久久中文字幕导航| 亚洲欧美日韩在线高清直播| 欧美α欧美αv大片| 美女精品视频一区| 一本色道久久| 亚洲香蕉网站| 亚洲福利av| 亚洲视频香蕉人妖| 在线成人av网站| 99精品久久| 一区精品在线播放| aa级大片欧美| 亚洲高清视频在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 久久精品一区二区国产| 蜜臀久久99精品久久久画质超高清 | 久久天堂国产精品| 亚洲欧美日韩国产精品| 欧美xart系列高清| 免费成人黄色| 国产一区二区中文| 中文成人激情娱乐网| 亚洲国产专区| 久久久久国产精品一区三寸| 亚洲一区二区在线观看视频| 久久午夜羞羞影院免费观看| 午夜一区不卡| 欧美午夜不卡影院在线观看完整版免费| 麻豆久久婷婷| 国内一区二区在线视频观看| 亚洲欧美国产毛片在线| 亚洲男同1069视频| 欧美午夜欧美| 日韩亚洲精品在线| 99国产精品国产精品毛片| 久久久久久久综合狠狠综合| 亚洲欧美国产精品专区久久| 欧美精品999| 亚洲国产高清一区二区三区| 国产精品免费在线 | 亚洲国产成人久久| 亚洲国产精品视频| 欧美96在线丨欧| 免费一级欧美片在线播放| 国产亚洲精品一区二区| 午夜精彩视频在线观看不卡 | 午夜亚洲精品| 久久激情网站| 国产一区二区日韩精品| 亚洲综合999| 久久精品理论片| 黄色精品一二区| 欧美在线视频导航| 国产精品―色哟哟| 亚洲欧美在线看| 久久久久久久尹人综合网亚洲| 国产欧美精品va在线观看| 欧美制服丝袜第一页| 可以看av的网站久久看| 亚洲国产老妈| 欧美激情一区二区三区成人| 亚洲精品人人| 香港成人在线视频| 国产一区在线观看视频| 久久综合伊人77777| 亚洲国产清纯| 午夜久久黄色| 亚洲国产精品成人精品| 欧美色图麻豆| 久久狠狠一本精品综合网| 欧美激情一区二区三区| 一本色道久久| 一区二区三区自拍| 欧美日韩精品一区| 久久国产日韩欧美| 亚洲精品美女久久久久| 久久av老司机精品网站导航| 激情综合网激情| 国产精品久久久久久户外露出| 欧美亚洲一区| 亚洲精品韩国| 久久综合伊人77777蜜臀| 999亚洲国产精| 韩国女主播一区| 欧美视频日韩视频在线观看| 欧美一级久久久| 亚洲美女av黄| 欧美顶级少妇做爰| 欧美亚洲免费电影| 99视频有精品| 亚洲电影在线播放| 国产精品区一区二区三| 欧美精品激情在线| 久久人人97超碰人人澡爱香蕉| 亚洲午夜精品网| 亚洲欧洲日本一区二区三区| 久久综合狠狠综合久久综合88| 午夜激情综合网| 亚洲最快最全在线视频| 激情久久婷婷| 国内精品久久久久影院薰衣草| 国产精品久久久久久久久久尿 | 亚洲欧洲一区二区在线播放| 久久久久久亚洲精品杨幂换脸|