設(shè)計模式學(xué)習(xí)及其C語言實現(xiàn)筆記_第1頁
設(shè)計模式學(xué)習(xí)及其C語言實現(xiàn)筆記_第2頁
設(shè)計模式學(xué)習(xí)及其C語言實現(xiàn)筆記_第3頁
設(shè)計模式學(xué)習(xí)及其C語言實現(xiàn)筆記_第4頁
設(shè)計模式學(xué)習(xí)及其C語言實現(xiàn)筆記_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、wordword I 13lOperation *pOper; /- COperati onAdd Add; COperati on Sub Sub; COperatio nMul Mul; COperatio nDiv Div; double result=0;定義接口指針,多態(tài)實現(xiàn)用lOperation *pOper; /- COperati onAdd Add; COperati on Sub Sub; COperatio nMul Mul; COperatio nDiv Div; double result=0;定義接口指針,多態(tài)實現(xiàn)用/ 類的構(gòu)造CLASS_CTOR(COperati

2、o nAdd,Add); CLASS_CTOR(COperatio nSub,Sub); CLASS_CTOR(COperati on Mul,Mul); CLASS_CTOR(COperati on Div,Div);/靜態(tài)內(nèi)存分配處理方法pOper = &Add;result = pOper-GetResult(53.12,86.4);prin tf(ADD: 53.12+86.4 =%6.3frn ”,result);pOper = & Sub; /- 減法result = pOper-GetResult(53.12,86.4); prin tf(Sub: 53.12-86.4 =%6.

3、3frn,result);pOper = & Mui; /- 乘法result = pOper-GetResult(53.12,86.4); prin tf(Mul: 53.12*86.4 =%6.3frn,result);pOper = & Div; /- 除法result = pOper-GetResult(53.12,86.4); prin tf(Div: 53.12/86.4 =%6.4fr n,result);II動態(tài)內(nèi)存分配方法 /-加法 printf(rn dynamic memory:rnn); pOper =New(COperatio nAdd);result = pOper

4、-GetResult(12.5,36.8); prin tf(ADD: 12.5+36.8 =%6.3fr n,result); II-減法pOper =New(COperatio nSub);result = pOper-GetResult(12.5,36.8); prin tf(Sub: 12.5-36.8 =%6.3frn,result); II-乘法pOper =New(COperati onM ul);result = pOper-GetResult(12.5,36.8); prin tf(Mul: 12.5*36.8 =%6.3frn,result); II-除法pOper =Ne

5、w(COperatio nDiv);result = pOper-GetResult(12.5,36.8);prin tf(Div: 12.5/36.8 =%6.3frn,result);結(jié)果輸出如下:dyn amic memory:從main()函數(shù)的調(diào)用可以看出,處理運(yùn)算始終是pOper-GetResult(numA , numB)這條語句,改變其運(yùn)算功能,只需要改變pOper所指向的對象。這就是多態(tài),一樣的語句實現(xiàn)不同的功能。抽象和多態(tài)在面向?qū)ο?C和設(shè)計模式中將顯示出強(qiáng)大的威力。第2章:面向?qū)ο?C必要根底知識為了幫助大家理解 OO(和更好的使用OOC這章主要是講解一些必要的C語言和宏

6、定義,介紹OOC.h為什么要這樣設(shè)計。1、本書的OOC書寫規(guī)如此1.1、普通類的定義CLASS(className) typeName data;void (* in it)(void*t, type others);/typeName (*m_fu nctio n)(void*t, type others typeName data;void (* in it)(void*t, type others);/typeName (*m_fu nctio n)(void*t, type others 其他看情況;普通類是沒有繼承過任何類、任何接口的類。普通類必須要有 1.2、抽象類的定義ABSTR

7、ACT_CLASS(className) typeName data;void (* in it)(void*t, type others);/typeName (*m_fu nctio n)(void*t, type others 其他看情況必須有該函數(shù),參數(shù)至少有void*t);/- 至少有void*t 參數(shù),必須有該函數(shù),參數(shù)至少有void*t);/- 至少有void*t 參數(shù),;實質(zhì)上和普通類是一樣的定義,只是沒有自己的方法實現(xiàn),宏 可讀性。如果抽象類沒有數(shù)據(jù)data,最好就定義為接口。;實質(zhì)上和普通類是一樣的定義,只是沒有自己的方法實現(xiàn),宏 可讀性。如果抽象類沒有數(shù)據(jù)data,最好就

8、定義為接口。1.3、接口和實現(xiàn)ABSTRACT_CLAS目的是幫助程序的INTERFACE(IName)typeName (*m_fu nction)( type others ;CLASS(Chid_lmpleme nt) IMPLEMENTS(IName); void (*i ni t)(void*t);/-;接口的出現(xiàn)就是希望一個接口能有多個實現(xiàn),typeName (*m_fu nction)( type others ;CLASS(Chid_lmpleme nt) IMPLEMENTS(IName); void (*i ni t)(void*t);/-;接口的出現(xiàn)就是希望一個接口能有多

9、個實現(xiàn),一個接口至少有 上才有意義,否如此接口可以合并到子類中去。1.4 一個接口至少有 上才有意義,否如此接口可以合并到子類中去。1.4 繼承:在子類的最開頭加宏EXTENDS(baseClass);個實現(xiàn),接口只有在有2個實現(xiàn)以例如繼承A,繼承A,必須放在最開頭 EXTENDS(A); -B;1.5、類的構(gòu)造:將函數(shù)指針和函數(shù)關(guān)聯(lián) 沒有父類的類的構(gòu)造:CTOR(ClassName)FUNCTION_BINDING(FUN1,FUN2);END_CTOR有繼承的類的構(gòu)造:CTOR(ClassName)BASE_CTOR(baseClass)FUNCTION_BINDING(FUN1,FUN2

10、);END_CTOR1.6、動態(tài)內(nèi)存分配ClassName *pClass = New_ClassName(); 或者ClassName *pClass = NEW(ClassName); 或ClassName *pClass = New(ClassName);提供多種方法,讀者可以根據(jù)自己的喜好選擇,本人習(xí)慣用pClass = New(ClassName),方式,這樣New()看起來更接近C+運(yùn)算符new。1.7、顯式構(gòu)造函數(shù)CLASS_CTOR(ClassName, objName);或者ClassName_Sett in g(&objName)這兩個宏展開后實際上是一樣的,提供兩種方法是

11、方便不同人的使用習(xí)慣。顯式構(gòu)造函數(shù)主要 用于類實例化后對其進(jìn)展構(gòu)造。在動態(tài)內(nèi)存分配中已經(jīng)隱含了對該宏對應(yīng)的函數(shù)的調(diào)用。1.8、動態(tài)對象內(nèi)存釋放DEL(p);或者DELETE(p);2、面向?qū)ο驩OC.H的設(shè)計與其關(guān)鍵宏含義面向?qū)ο驝的關(guān)鍵宏頭文件OOC.H最初的設(shè)計思想來源于高煥堂教師著的UML+OOP嵌入式C語言開發(fā)精講中的lw_oopc_kc.h。原作中提供了類的封裝和接口,以與在這根底上演化的對象、信息 傳遞和接口多態(tài)等。本文在其根底上進(jìn)展了符合自己編程習(xí)慣的改良,并增加了繼承機(jī)制。從而OOC中實現(xiàn)類的封裝、繼承和多態(tài),從而實現(xiàn)了OO中的三大主要特征?;诖说母咨线€考慮虛函數(shù)的處理方法

12、等。OOC. H的文件內(nèi)容為:/*_- ooc.h */#ifndef _OOC_H#defi ne _OOC_H#i nclude /*默認(rèn)可以動態(tài)內(nèi)存分配,如果不使用動態(tài)內(nèi)存分配,在#in clude OOC.H 前定義#define OOC_SMALL,或者 #define OOC_STATIC*/#ifndef OOC_SMALL#ifndef OOC_STATIC#defi ne New(type) New_#type() /dynmic mode#defi ne NEW(type) New_#type() /dynmic mode#defi ne DELETE(type) free

13、(type) / free the memory#define DEL(type) free(type)#en dif#en dif/#define CLASS(type)typedef struct type type; struct type#ifndef OOC_SMALL#ifndef OOC_STATIC#ifndef OOC_DYNAMIC#define CTOR(type) void* type#_Sett in g(type*); void* New_#type() struct type *cthis; cthis = (struct type *)malloc(sizeof

14、(struct type); return type#_Sett in g(cthis); void* type#_Sett in g(type *cthis) #else#define CTOR(type) void* New_#type() struct type *cthis; cthis = (struct type *)malloc(sizeof(struct type);#en dif#else#define CTOR(type) void* type#_Setti ng(type *cthis) #en dif#en dif#defi ne END_CTOR return (vo

15、id*)cthis; #defi ne FUNCTION_SET(pfu n, fun) cthis-pfu n = fun;#defi ne IMPLEMENTS(type) type type#define INTERFACE(type) typedef struct type type; struct type/轉(zhuǎn)義定義/#define CLASS_CTOR(type,obj) type#_Setting(&obj)#defi ne EXTENDS(BaseClass) IMPLEMENTS(BaseClass)#defi ne BASE_CTOR(type)CLASS_CTOR(typ

16、e,cthis-type); CLASS_CTOR(A,cthis-A);#defi ne ABSTRACT_CLASS CLASS#defi ne FUNCTION_SETTING FUNCTION_SET/ Virtual是一個空格,在這里只是提示用,沒有任何意義#defi ne Virtual#en dif/* end */2.1、宏 CLASS(className)CLASS(className)展開后為:typedef struct className className;struct className也就是說:className不僅是個結(jié)構(gòu)體名,同時還表示:struct clas

17、sName ;因為在 C中定義結(jié)構(gòu)體變量時候必須有 struct在前,如:struct A用結(jié)構(gòu)體A定義一個結(jié)構(gòu)體變量 a,應(yīng)寫為:struct A a ;這點(diǎn)和C+結(jié)構(gòu)體定義不同。C+ 的結(jié)構(gòu)體實際就是一個特殊的類, 在C+沖變量a的定義為:A a (沒有帶struct)。為了讓宏CLASS() 定義的類(結(jié)構(gòu)體)比擬接近C+中定義的類,把struct 通過typedef方法讓className隱式 包含了 struct 。2.2、宏 CTOR(type),在有動態(tài)內(nèi)存分配的情況下,其定義為:#define CTOR(type) void* type#_Sett in g(type*); v

18、oid* New_#type() struct type *cthis; cthis = (struct type *)malloc(sizeof(struct type); return type#_Sett in g(cthis); void* type#_Sett in g(type *cthis) 也就是 CTOR(type)代表了 void* type#_Setting(type*);void* New_#type() 這段代碼,其中已經(jīng)包含了一個動態(tài)內(nèi)存分配函數(shù)和半個type#_Sett in g(type *cthis);結(jié)合CTOR(type)FUNCTION_SETTING

19、(f1, f2);END_CTOR就可以知道, CTOR()和END_CTOR之間包含了兩個完整的函數(shù),一個動態(tài)內(nèi)存分配函數(shù) New_type()和構(gòu)造函數(shù) type_Setting().在沒有動態(tài)內(nèi)存分配的情況,如此表示void* type#_Sett in g(type*),即半個函數(shù),組FUNCTION_SETTING (f1, f2); 和END_CTOF組合成一個完整的函數(shù),也就是實現(xiàn)對象與其方法 函數(shù)實體的關(guān)聯(lián)。2.3、宏 New(type)這是動態(tài)對象分配函數(shù),宏定義為:#define New(type) New_#type()其中#表示連接字符的符號。比如New(classA)

20、,先是被替換為 New_#classA(),因為#是連接符號,故變成 New_classA().即為宏定義的動態(tài)內(nèi)存分配函數(shù)和構(gòu)造函數(shù),實現(xiàn)了定義的同時也構(gòu)造了這很接近 C+的模式了。2.4、宏 CLASS_CTOR(type,obj)定義:CLASS_CTOR(type,obj) type#_Setting(&obj)其實是void* type#_Setting(type*)宏函數(shù)的另一種寫法,定義該宏主要是把宏和類從一個字符串中別離出來便于書寫和理解。CLASS_CTO類名,對象名)一一必須要遵守這個規(guī)如此,否如此會出錯。2.5、宏 BASE_CTOR(base)定義:BASE_CTOR(

21、base)CLASS_CTOR(base, cthis- base);該宏是在派生類的構(gòu)造函數(shù)內(nèi)用,不能在其他地方使用,也不能獨(dú)立使用。因為該宏包含有cthis指針。該指針只有在CTOR().END_CTOR之間才能引用,cthis 是CTOR()宏內(nèi)部定義的指針。2.6 宏 INTERFACE( type ) 和 宏 IMPLEMENTS(type)定義:#define INTERFACE(type) typedef struct type type; struct type和CLASS()宏的含義一樣,單獨(dú)定義主要是強(qiáng)調(diào)其定義的是接口。接口對應(yīng)的實現(xiàn)的宏是IMPLEMENTS(type),其定義很簡單,就是:#define IMPLEMENTS(type) type type也就是定義一個結(jié)構(gòu)體變量,這個結(jié)構(gòu)體類型是type,這個結(jié)構(gòu)體變量名也是type。第3章:活字印刷一一簡單工廠模式在印刷術(shù)發(fā)明前,人們的印刷書是一個很艱巨的工程,先是請雕刻師將每一頁的文字刻在木板上, 然后再一頁一頁的印刷。如果在雕刻過程中,錯了一個字或者要改動一個字,該頁面的木板又得重 新雕刻。印刷完畢后,這些雕刻的木板也就沒用扔掉,前面雕刻

溫馨提示

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

評論

0/150

提交評論