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++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。


首先定义数据容器    

  1. typedef struct _Container  
  2. {  
  3.     int* pData;  
  4.     int size;  
  5.     int length;  
  6.   
  7.     Interator* (*create_new_interator)(struct _Container* pContainer);  
  8.     int (*get_first)(struct _Container* pContainer);  
  9.     int (*get_last)(struct _Container* pContainer);  
  10.   
  11. }Container;  

然后定义一个迭代器,注意:主要迭代器的首个元素 void* pVector;类型为void *指针,即可以指向不同类型的结构体,
  1. typedef struct _Interator  
  2. {  
  3.     void* pVector;  
  4.     int index;  
  5.   
  6.     int(* get_first)(struct _Interator* pInterator);   
  7.     int(* get_last)(struct _Interator* pInterator);  
  8. }Interator;
  9.     

使用时,首先调用Container中的
Interator* (*create_new_interator)(struct _Container* pContainer);  
方法,创建一个sizeof(struct _Container)的结构体,将指针强制转换成Interator*,然后赋给 void* pVector;,这样在操作时对Interator结构体中的方法操作也就是对数据容器进行操作。



原创粉丝点击