設(shè)計(jì)模式C實(shí)現(xiàn)(5)——原型模式、模板方法模式_第1頁(yè)
設(shè)計(jì)模式C實(shí)現(xiàn)(5)——原型模式、模板方法模式_第2頁(yè)
設(shè)計(jì)模式C實(shí)現(xiàn)(5)——原型模式、模板方法模式_第3頁(yè)
設(shè)計(jì)模式C實(shí)現(xiàn)(5)——原型模式、模板方法模式_第4頁(yè)
設(shè)計(jì)模式C實(shí)現(xiàn)(5)——原型模式、模板方法模式_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)計(jì)模式c+實(shí)現(xiàn)(5 ) 原型模式、模板方法模式分類(lèi):設(shè)計(jì)模式2011 -08-07 16:37 2075人閱讀評(píng)論收藏舉報(bào)軟件領(lǐng)域中的設(shè)計(jì)模式為開(kāi)發(fā)人員提供了一種使用專(zhuān)家設(shè)計(jì)經(jīng)驗(yàn)的有效途徑。設(shè)計(jì)模式中 運(yùn)用了面向?qū)ο缶幊陶Z(yǔ)言的重要特性:封裝、繼承、多態(tài),真正領(lǐng)悟設(shè)計(jì)模式的精髓是可能一個(gè) 漫長(zhǎng)的過(guò)程,需要大量實(shí)踐經(jīng)驗(yàn)的積累。最近看設(shè)計(jì)模式的書(shū),對(duì)于每個(gè)模式,用c+寫(xiě)了個(gè) 小例子,加深一下理解。主要參考大話設(shè)計(jì)模式和設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ) (dp)兩本書(shū)。本文介紹原型模式和模板方法模式的實(shí)現(xiàn)。首先介紹原型模式,然后引出模板 方法模式。dp書(shū)上的定義為:用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并

2、且通過(guò)拷貝這些原型創(chuàng)建新的對(duì) 象。其中有一個(gè)詞很重要,那就是拷貝??梢哉f(shuō),拷貝是原型模式的精髓所在。舉個(gè)現(xiàn)實(shí)中的例 子來(lái)介紹原型模式。找工作的時(shí)候,我們需要準(zhǔn)備簡(jiǎn)歷。假設(shè)沒(méi)有打印設(shè)備,因此需手寫(xiě)簡(jiǎn)歷, 這些簡(jiǎn)歷的內(nèi)容都是一樣的。這樣有個(gè)缺陷,如果要修改簡(jiǎn)歷中的某項(xiàng),那么所有已寫(xiě)好的簡(jiǎn)歷 都要修改,工作量很大。隨著科技的進(jìn)步,出現(xiàn)了打印設(shè)備。我們只需手寫(xiě)一份,然后利用打印 設(shè)備復(fù)印多份即可。如果要修改簡(jiǎn)歷屮的某項(xiàng),那么修改原始的版本就可以了,然后再?gòu)?fù)印。原 始的那份手寫(xiě)稿相當(dāng)于是一個(gè)原型,有了它,就可以通過(guò)復(fù)?。截悾﹦?chuàng)造出更多的新簡(jiǎn)歷。這 就是原型模式的基本思想。下面給出原型模式的uml圖,以

3、剛才那個(gè)例子為實(shí)例。prototype 二 resume«virtual» cloneqresumearesumebcloneqclone。原型模式實(shí)現(xiàn)的關(guān)鍵就是實(shí)現(xiàn)clone函數(shù),對(duì)于c+來(lái)說(shuō),其實(shí)就是拷貝構(gòu)造函數(shù),需 實(shí)現(xiàn)深拷貝,下面給出一種實(shí)現(xiàn)。cpp view plaincopyprint?1. 父類(lèi)2. class resume3. 4. protected:5. char *name;6. public:7.resume() 8.virtual -resume() 9.virtual resume* clone() return null; 10.virtual

4、 void set(char *n) 11-virtual void show() 12. ;cpp view plaincopyprint?1.class resumea : public resume2.3.public:4.resumea(const char *str);構(gòu)造函數(shù)5.resumea(const resumea &r); /拷貝構(gòu)造窗數(shù)6.resumea();/析構(gòu)函數(shù)7.resumea* clone();/克隆,關(guān)鍵所在8.void show();/顯示內(nèi)容9.;10.resumea:resumea(const char*str)11.12.if(str = n

5、ull) 13.name = new charl;name0 = '0';else 17.name = new charstrien(str)+l;strcpy(name str);19.20.21.resumea:resumea() delete name;22.resumea:resumea(const resumea &r) 23.name = new charstrien()+l;24.strcpycname rname);26.resumea* resumea:clone() 27.return new resumea(*this);29.void

6、 resumea:show() 30.cout<<"resumea name : u<<name<endl;31. 這里只給出了 resumea的實(shí)現(xiàn),resumeb的實(shí)現(xiàn)類(lèi)似。使用的方式如下:cpp view plaincopyprint?1.int main()2.3.resume *rl = new resumeaca'1);4.resume *r2 = new resumebcb11);5.resume *r3 = rl->clone();6.resume *r4 = r2->clone();7.rl->show();

7、r2->show();8./刪除 rl,r29.delete rl; delete r2;10.rl = r2 = null;11./深拷貝所以對(duì)r3,r4無(wú)影響12.r3->show(); r4->show();13.delete r3; delete r4;14.r3 = r4 = null;15.最近有個(gè)招聘會(huì),可以帶上簡(jiǎn)歷去應(yīng)聘了。但是,其中有一家公司不接受簡(jiǎn)歷,而是給應(yīng) 聘者發(fā)了一張簡(jiǎn)歷表,上面有基本信息、教育背景、工作經(jīng)歷等欄,讓?xiě)?yīng)聘者按照要求填寫(xiě)完整。 每個(gè)人拿到這份表格后,就開(kāi)始填寫(xiě)。如果用程序?qū)崿F(xiàn)這個(gè)過(guò)程,該如何做呢? 一種方案就是用 模板方法模式:定義一個(gè)

8、操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi) 可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。我們的例子中,操作就是填寫(xiě)簡(jiǎn) 歷這一過(guò)程,我們可以在父類(lèi)中定義操作的算法骨架,而具體的實(shí)現(xiàn)由子類(lèi)完成。下面給岀它的 uml 圖。resume«virtual» setpersonallnfoo?*«virtual» seteducationo «virtual» setworkexpofillresumeqsetpersonallnfoo; seteducationo; setworexpq;resumearesum

9、ebsetpersonallnfoo seteducationo setworkexposetpersonallnfoo seteducationo setworkexpo其中fillresumeo定義了操作的骨架,依次調(diào)用子類(lèi)實(shí)現(xiàn)的函數(shù)。相當(dāng)于每個(gè)人填寫(xiě)簡(jiǎn)歷 的實(shí)際過(guò)程。接著給出相應(yīng)的c+代碼。cpp view plaincopyprint?1.簡(jiǎn)歷2.class rtected: /保護(hù)成員5virtual void setpersonallnfo() 6.virtual void seteducation() 7.virtual void setworkexp() 8

10、.public:9.void fillresumeo10-11 setpersonailnfo();12.seteducation();13-setworkexpo;15- ;16 classresumea: public resume18 protected:19 voidsetpersonalinfo() cout<<"a,s personallnfo,<<endl; voidseteducation() cout<<,a,s education”<<endl; 21.voidsetworkexpo cout<<&quo

11、t;a's work experience,<<endl; 22. ;23- class resumeb: public resume24. 25. protected:26 void setpersonalinfo() cout<<,b,s personallnfo,<<endl; 27.void seteducation() cout<<"b,s educationh<<endl; 28.void setworkexp() coutwork experiencc<gndl; 29. ;使用方式如下:cpp view pl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論