C++与C语言对照学习(设计模式)
来源:互联网 发布:指南针淘宝店是正品吗 编辑:程序博客网 时间:2024/05/18 00:39
设计模式与语法:http://blog.csdn.net/feixiaoxing/article/details/7294900
上面是C语言的角度来解析C++中的设计模式,很有借鉴价值,使用C语言可以使我理解得更加深刻。
2013/7/27晚:
学习了《单件模式》(也称为单例模式),了解了其中的思想:不用默认的构造函数构造对象,使构造函数声明为私有(这样可以堵死其他创建实例的动作)。构造函数如果不定义,则默认生成空的构造函数,若有显式定义的构造方法,默认的构造方法就会失效。因此,若将构造函数写成是private属性的,则不能通过new object()来构造实例了。
另外,利用static变量的特性,(定义一次,变量值保存不释放),可以判断该类的实例是否初始化实例过,即不重复实例化类对象。
需要补充的知识:new操作符(创建类实例的语法??)以及类的静态成员函数和静态数据成员的语法。
2013/8/2早上:
学习了《原型模式》和《组合模式》。
原型模式:首先要有一个基类A和三个virtual虚方法,然后派生B,C类。B,C类中有虚方法的具体实现,包括clone()方法。由于基类中虚方法的特性,因此只需要一个通用接口函数clone()就可以生成不同的B类和C类对象。具体实现:这样在复制B类的对象和C类对象时,只需要一个B类或者C类的指针即可。
组合模式:整体和局部执行类似一样的功能,因此要有相同的接口。一般有一个基类A,两个派生类B,C。B类负责生成Composite类(普通节点),C类负责生成Leaf类(叶子节点),很像树状组织结构,有不同的级别,但功能类似(父节点同时也可以是子节点,叶子节点不再有子节点)——举例:以Composite类生成父节点,二叉树,首先产生父节点,然后生成子节点A,接着可以生成A的叶子节点,或者生成普通兄弟节点。取决于不同的实现接口。
2013/8/2早上:
一下子看了《模板模式》,《工厂模式》,《责任链模式》,《抽象工厂模式》,《迭代器模式》,逐一总结一下:
模板模式:
在C++中可以定义一个模板类A,在用到模板方法的地方里面声明虚函数,这样B类在继承A类的时候可以具体实现相应的虚函数方法。而在C语言中,模板的实现可以在结构体定义一个函数指针pfunc,具体实现在结构体外的定义相应的函数,使用时只需要对结构体中的函数指针pfunc赋值就可以了。
原话:这里的template主要是一种流程上的统一,细节实现上的分离
工厂模式:
实现接口统一(可能只有一个方法一个接口),但实现方法不同。根据输入参数判断调用哪一个方法。
责任链模式:
责任链模式是很实用的一种实际方法。举个例子来说,我们平常在公司里面难免不了报销流程。但是,我们知道公司里面每一级的领导的报批额度是不一样的。比如说,科长的额度是1000元,部长是10000元,总经理是10万元。所以责任链就是不停地寻找上一级,类似于链表的遍历。
例如,如果已经知道有五个级别不同的Leader,所以先要定义一个Leader_0 ~ Leader_4共五个对象,然后调用set_account(const struct _Leader* pLeader, struct _Leader* next)和set_next_leader(const struct _Leader* pLeader, struct _Leader* next)函数为五个级别的领导设定报批额度,和五个领导的级别关系(用指针指向)。最后在使用时,调用int request_for_manager(struct _Leader* pLeader, int num)即可。
抽象工厂模式:
前面我们写过的工厂模式实际上是对产品的抽象。对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。怎么理解呢,举个例子。
假设有两个水果店都在卖水果,都卖苹果和葡萄。其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。
针对抽象工厂的特点,可以在一个工厂中生产不同的产品,相同品种的产品用同一个接口,不同品种另外处置,主要还是对相同的产品进行抽象出函数指针(C++中就是虚函数),然后再具体实现产品的生产方法。
(重要思想)迭代器模式:
使用过C++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。
首先定义数据容器
- typedef struct _Container
- {
- int* pData;
- int size;
- int length;
- Interator* (*create_new_interator)(struct _Container* pContainer);
- int (*get_first)(struct _Container* pContainer);
- int (*get_last)(struct _Container* pContainer);
- }Container;
然后定义一个迭代器,注意:主要迭代器的首个元素 void* pVector;类型为void *指针,即可以指向不同类型的结构体,
- typedef struct _Interator
- {
- void* pVector;
- int index;
- int(* get_first)(struct _Interator* pInterator);
- int(* get_last)(struct _Interator* pInterator);
- }Interator;
使用时,首先调用Container中的
Interator* (*create_new_interator)(struct _Container* pContainer);
方法,创建一个sizeof(struct _Container)的结构体,将指针强制转换成Interator*,然后赋给 void* pVector;,这样在操作时对Interator结构体中的方法操作也就是对数据容器进行操作。
- C++与C语言对照学习(设计模式)
- C语言与设计模式
- C语言设计与模式(开篇)
- C语言设计模式与接口
- C语言-设计模式
- C语言-设计模式
- C语言-设计模式
- C语言设计模式
- C语言-设计模式
- c语言设计模式
- Delphi与C语言类型转换对照
- ARM汇编与C语言对照
- Delphi与C语言类型转换对照
- C语言:华氏温度与摄氏温度对照表
- C语言和设计模式
- C语言和设计模式
- C语言设计模式:迭代器
- C语言设计模式:备忘录
- TabControl控件和TabPage
- 二分查找(简单版)——数组下标表示
- 二分查找bsearch.c源码分析
- A+B for Input-Output Practice (VII)
- ios 获取当前时间
- C++与C语言对照学习(设计模式)
- VB查询数据库之结账——机房收费系统总结(五)
- 笔记2 (标准库类型string、vector和bitset)
- 第十四周 数组
- 依赖注入框架Autofac的简单使用
- cocos2d-x重力感应
- 如何在word2013(2007、2010)中添加带滚动条的文本框
- Django ModelForm的使用
- const int *pi 与int *const pi区别 (void*)