C语言和设计模式(享元模式)
【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing @163.com】享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。
typedef struct _Font
{
int type;
int sequence;
int gap;
int lineDistance;
void (*operate)(struct _Font* pFont);
}Font; 上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。
typedef struct _FontFactory
{
Font** ppFont;
int number;
int size;
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance);
}FontFactory;
这里的GetFont即使对当前的Font进行判断,如果Font存在,那么返回;否则创建一个新的Font模式。
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance)
{
int index;
Font* pFont;
Font* ppFont;
if(NULL == pFontFactory)
return NULL;
for(index = 0; index < pFontFactory->number; index++)
{
if(type != pFontFactory->ppFont->type)
continue;
if(sequence != pFontFactory->ppFont->sequence)
continue;
if(gap != pFontFactory->ppFont->gap)
continue;
if(lineDistance != pFontFactory->ppFont->lineDistance)
continue;
return pFontFactory->ppFont;
}
pFont = (Font*)malloc(sizeof(Font));
assert(NULL != pFont);
pFont->type = type;
pFont->sequence = sequence;
pFont->gap = gap;
pFont->lineDistance = lineDistance;
if(pFontFactory-> number < pFontFactory->size)
{
pFontFactory->ppFont = pFont;
pFontFactory->number ++;
return pFont;
}
ppFont = (Font**)malloc(sizeof(Font*) * pFontFactory->size * 2);
assert(NULL != ppFont);
memmove(ppFont, pFontFacoty->ppFont, pFontFactory->size);
free(pFontFactory->ppFont);
pFontFactory->size *= 2;
pFontFactory->number ++;
ppFontFactory->ppFont = ppFont;
return pFont;
}
作者:feixiaoxing 发表于2011-12-26 22:26:49 原文链接 C语言和设计模式(装饰模式)平凡的程序员|feixiaoxing
【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing @163.com】
装饰模式是比较好玩,也比较有意义。其实就我个人看来,它和责任链还是蛮像的。只不过一个是比较判断,一个是迭代处理。装饰模式就是那种迭代处理的模式,关键在哪呢?我们可以看看数据结构。
typedef struct _Object
{
struct _Object* prev;
void (*decorate)(struct _Object* pObject);
}Object; 装饰模式最经典的地方就是把pObject这个值放在了数据结构里面。当然,装饰模式的奥妙还不仅仅在这个地方,还有一个地方就是迭代处理。我们可以自己随便写一个decorate函数试试看,
void decorate(struct _Object* pObeject)
{
assert(NULL != pObject);
if(NULL != pObject->prev)
pObject->prev->decorate(pObject->prev);
printf("normal decorate!\n");
} 所以,装饰模式的最重要的两个方面就体现在:prev参数和decorate迭代处理。 C语言和设计模式(适配器模式)
【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing @163.com】
现在的生活当中,我们离不开各种电子工具。什么笔记本电脑、手机、mp4啊,都离不开充电。既然是充电,那么就需要用到充电器。其实从根本上来说,充电器就是一个个普通的适配器。什么叫适配器呢,就是把220v、50hz的交流电压编程5~12v的直流电压。充电器就干了这么一件事情。
那么,这样的一个充电适配器,我们应该怎么用c++描述呢? class voltage_12v
{
public:
voltage_12v() {}
virtual ~voltage_12v() {}
virtual void request() {}
};
class v220_to_v12
{
public:
v220_to_v12() {}
~v220_to_v12() {}
void voltage_transform_process() {}
};
class adapter: public voltage_12v
{
v220_to_v12* pAdaptee;
public:
adapter() {}
~adapter() {}
void request()
{
pAdaptee->voltage_transform_process();
}
};
通过上面的代码,我们其实可以这样理解。类voltage_12v表示我们的最终目的就是为了获得一个12v的直流电压。当然获得12v可以有很多的方法,利用适配器转换仅仅是其中的一个方法。adapter表示适配器,它自己不能实现220v到12v的转换工作,所以需要调用类v220_to_v12的转换函数。所以,我们利用adapter获得12v的过程,其实就是调用v220_to_v12函数的过程。
不过,既然我们的主题是用c语言来编写适配器模式,那么我们就要实现最初的目标。这其实也不难,关键一步就是定义一个Adapter的数据结构。然后把所有的Adapter工作都由Adaptee来做,就是这么简单。不知我说明白了没有?typdef struct _Adaptee
{
void (*real_process)(struct _Adaptee* pAdaptee);
}Adaptee;
typedef struct _Adapter
{
void* pAdaptee;
void (*transform_process)(struct _Adapter* pAdapter);
}Adapter;
作者:feixiaoxing 发表于2011-12-28 20:15:28 原文链接
页:
[1]