求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

C语言和设计模式 教程
开篇
单件模式
原型模式
组合模式
模板模式
工厂模式
责任链模式
抽象工厂模式
迭代器模式
外观模式
代理模式
享元模式
装饰模式
适配器模式
策略模式
中介者模式
建造者模式
桥接模式
观察者模式
备忘录模式
解释器模式
命令模式
状态模式
访问者模式
继承、封装、多态
 
 

模板模式
852 次浏览
35次  

模板对于学习C++的同学,其实并不陌生。函数有模板函数,类也有模板类。那么这个模板模式是个什么情况?我们可以思考一下,模板的本质是什么。比如说,现在我们需要编写一个简单的比较模板函数。

template <typename type>  
int compare (type a, type b)
{
return a > b ? 1 : 0;
}

模板函数提示我们,只要比较的逻辑是确定的,那么不管是什么数据类型,都会得到一个相应的结果。固然,这个比较的流程比较简单,即使没有采用模板函数也没有关系。但是,要是需要拆分的步骤很多,那么又该怎么办呢?如果相通了这个问题,那么也就明白了什么是template模式。

比方说,现在我们需要设计一个流程。这个流程有很多小的步骤完成。然而,其中每一个步骤的方法是多种多样的,我们可以很多选择。但是,所有步骤构成的逻辑是唯一的,那么我们该怎么办呢?其实也简单。那就是在基类中除了流程函数外,其他的步骤函数全部设置为virtual函数即可。

class basic  
{
public:
void basic() {}
virtual ~basic() {}
virtual void step1() {}
virtual void step2() {}
void process()
{
step1();
step2();
}
};

basic的类说明了基本的流程process是唯一的,所以我们要做的就是对step1和step2进行改写。

class data_A : public basic  
{
public:
data_A() {}
~data_A() {}
void step1()
{
printf("step 1 in data_A!\n");
}

void step2()
{
printf("step 2 in data_A!\n");
}
};

所以,按照我个人的理解,这里的template主要是一种流程上的统一,细节实现上的分离。明白了这个思想,那么用C语言来描述template模式就不是什么难事了。

typedef struct _Basic  
{
void* pData;
void (*step1) (struct _Basic* pBasic);
void (*step2) (struct _Basic* pBasic);
void (*process) (struct _Basic* pBasic);
}Basic;

因为在C++中process函数是直接继承的,C语言下面没有这个机制。所以,对于每一个process来说,process函数都是唯一的,但是我们每一次操作的时候还是要去复制一遍函数指针。而step1和step2是不同的,所以各种方法可以用来灵活修改自己的处理逻辑,没有问题。

void process(struct _Basic* pBasic)  
{
pBasic->step1(pBasic);
pBasic->step2(pBasic);
}

您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



852 次浏览
35次
 捐助