设计模式学习及其C语言实现笔记_第1页
设计模式学习及其C语言实现笔记_第2页
设计模式学习及其C语言实现笔记_第3页
设计模式学习及其C语言实现笔记_第4页
设计模式学习及其C语言实现笔记_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、wordword I 13lOperation *pOper; /- COperati onAdd Add; COperati on Sub Sub; COperatio nMul Mul; COperatio nDiv Div; double result=0;定义接口指针,多态实现用lOperation *pOper; /- COperati onAdd Add; COperati on Sub Sub; COperatio nMul Mul; COperatio nDiv Div; double result=0;定义接口指针,多态实现用/ 类的构造CLASS_CTOR(COperati

2、o nAdd,Add); CLASS_CTOR(COperatio nSub,Sub); CLASS_CTOR(COperati on Mul,Mul); CLASS_CTOR(COperati on Div,Div);/静态内存分配处理方法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动态内存分配方法 /-加法 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);结果输出如下:dyn amic memory:从main()函数的调用可以看出,处理运算始终是pOper-GetResult(numA , numB)这条语句,改变其运算功能,只需要改变pOper所指向的对象。这就是多态,一样的语句实现不同的功能。抽象和多态在面向对象 C和设计模式中将显示出强大的威力。第2章:面向对象 C必要根底知识为了帮助大家理解 OO(和更好的使用OOC这章主要是讲解一些必要的C语言和宏

6、定义,介绍OOC.h为什么要这样设计。1、本书的OOC书写规如此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 其他看情况必须有该函数,参数至少有void*t);/- 至少有void*t 参数,必须有该函数,参数至少有void*t);/- 至少有void*t 参数,;实质上和普通类是一样的定义,只是没有自己的方法实现,宏 可读性。如果抽象类没有数据data,最好就定义为接口。;实质上和普通类是一样的定义,只是没有自己的方法实现,宏 可读性。如果抽象类没有数据data,最好就

8、定义为接口。1.3、接口和实现ABSTRACT_CLAS目的是帮助程序的INTERFACE(IName)typeName (*m_fu nction)( type others ;CLASS(Chid_lmpleme nt) IMPLEMENTS(IName); void (*i ni t)(void*t);/-;接口的出现就是希望一个接口能有多个实现,typeName (*m_fu nction)( type others ;CLASS(Chid_lmpleme nt) IMPLEMENTS(IName); void (*i ni t)(void*t);/-;接口的出现就是希望一个接口能有多

9、个实现,一个接口至少有 上才有意义,否如此接口可以合并到子类中去。1.4 一个接口至少有 上才有意义,否如此接口可以合并到子类中去。1.4 继承:在子类的最开头加宏EXTENDS(baseClass);个实现,接口只有在有2个实现以例如继承A,继承A,必须放在最开头 EXTENDS(A); -B;1.5、类的构造:将函数指针和函数关联 没有父类的类的构造:CTOR(ClassName)FUNCTION_BINDING(FUN1,FUN2);END_CTOR有继承的类的构造:CTOR(ClassName)BASE_CTOR(baseClass)FUNCTION_BINDING(FUN1,FUN2

10、);END_CTOR1.6、动态内存分配ClassName *pClass = New_ClassName(); 或者ClassName *pClass = NEW(ClassName); 或ClassName *pClass = New(ClassName);提供多种方法,读者可以根据自己的喜好选择,本人习惯用pClass = New(ClassName),方式,这样New()看起来更接近C+运算符new。1.7、显式构造函数CLASS_CTOR(ClassName, objName);或者ClassName_Sett in g(&objName)这两个宏展开后实际上是一样的,提供两种方法是

11、方便不同人的使用习惯。显式构造函数主要 用于类实例化后对其进展构造。在动态内存分配中已经隐含了对该宏对应的函数的调用。1.8、动态对象内存释放DEL(p);或者DELETE(p);2、面向对象OOC.H的设计与其关键宏含义面向对象C的关键宏头文件OOC.H最初的设计思想来源于高焕堂教师著的UML+OOP嵌入式C语言开发精讲中的lw_oopc_kc.h。原作中提供了类的封装和接口,以与在这根底上演化的对象、信息 传递和接口多态等。本文在其根底上进展了符合自己编程习惯的改良,并增加了继承机制。从而OOC中实现类的封装、继承和多态,从而实现了OO中的三大主要特征。基于此的根底上还考虑虚函数的处理方法

12、等。OOC. H的文件内容为:/*_- ooc.h */#ifndef _OOC_H#defi ne _OOC_H#i nclude /*默认可以动态内存分配,如果不使用动态内存分配,在#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/转义定义/#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不仅是个结构体名,同时还表示:struct clas

17、sName ;因为在 C中定义结构体变量时候必须有 struct在前,如:struct A用结构体A定义一个结构体变量 a,应写为:struct A a ;这点和C+结构体定义不同。C+ 的结构体实际就是一个特殊的类, 在C+冲变量a的定义为:A a (没有带struct)。为了让宏CLASS() 定义的类(结构体)比拟接近C+中定义的类,把struct 通过typedef方法让className隐式 包含了 struct 。2.2、宏 CTOR(type),在有动态内存分配的情况下,其定义为:#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() 这段代码,其中已经包含了一个动态内存分配函数和半个type#_Sett in g(type *cthis);结合CTOR(type)FUNCTION_SETTING

19、(f1, f2);END_CTOR就可以知道, CTOR()和END_CTOR之间包含了两个完整的函数,一个动态内存分配函数 New_type()和构造函数 type_Setting().在没有动态内存分配的情况,如此表示void* type#_Sett in g(type*),即半个函数,组FUNCTION_SETTING (f1, f2); 和END_CTOF组合成一个完整的函数,也就是实现对象与其方法 函数实体的关联。2.3、宏 New(type)这是动态对象分配函数,宏定义为:#define New(type) New_#type()其中#表示连接字符的符号。比如New(classA)

20、,先是被替换为 New_#classA(),因为#是连接符号,故变成 New_classA().即为宏定义的动态内存分配函数和构造函数,实现了定义的同时也构造了这很接近 C+的模式了。2.4、宏 CLASS_CTOR(type,obj)定义:CLASS_CTOR(type,obj) type#_Setting(&obj)其实是void* type#_Setting(type*)宏函数的另一种写法,定义该宏主要是把宏和类从一个字符串中别离出来便于书写和理解。CLASS_CTO类名,对象名)一一必须要遵守这个规如此,否如此会出错。2.5、宏 BASE_CTOR(base)定义:BASE_CTOR(

21、base)CLASS_CTOR(base, cthis- base);该宏是在派生类的构造函数内用,不能在其他地方使用,也不能独立使用。因为该宏包含有cthis指针。该指针只有在CTOR().END_CTOR之间才能引用,cthis 是CTOR()宏内部定义的指针。2.6 宏 INTERFACE( type ) 和 宏 IMPLEMENTS(type)定义:#define INTERFACE(type) typedef struct type type; struct type和CLASS()宏的含义一样,单独定义主要是强调其定义的是接口。接口对应的实现的宏是IMPLEMENTS(type),其定义很简单,就是:#define IMPLEMENTS(type) type type也就是定义一个结构体变量,这个结构体类型是type,这个结构体变量名也是type。第3章:活字印刷一一简单工厂模式在印刷术发明前,人们的印刷书是一个很艰巨的工程,先是请雕刻师将每一页的文字刻在木板上, 然后再一页一页的印刷。如果在雕刻过程中,错了一个字或者要改动一个字,该页面的木板又得重 新雕刻。印刷完毕后,这些雕刻的木板也就没用扔掉,前面雕刻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论