返回

C语言和设计模式(享元模式)

发布时间:2023-09-18 21:00:55 144

    享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用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[index]->type)
continue;

if(sequence != pFontFactory->ppFont[index]->sequence)
continue;

if(gap != pFontFactory->ppFont[index]->gap)
continue;

if(lineDistance != pFontFactory->ppFont[index]->lineDistance)
continue;

return pFontFactory->ppFont[index];
}

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[index] = 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;
}




特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
C语言和设计模式(装饰模式) 2023-09-18 17:51:11