您的位置:首页 > 编程语言 > C语言/C++

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

2014-06-25 09:53 337 查看
原文地址:http://blog.csdn.net/feixiaoxing/article/details/7104338

  享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。

[cpp] view
plaincopy

typedef struct _Font  

{  

    int type;  

    int sequence;  

    int gap;  

    int lineDistance;  

  

    void (*operate)(struct _Font* pFont);  

  

}Font;  

    上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。

[cpp] view
plaincopy

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模式。

[cpp] view
plaincopy

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;         

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 设计模式