winston 发表于 2011-12-31 19:47:47

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 原文链接

winston 发表于 2011-12-31 19:48:23

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迭代处理。

winston 发表于 2011-12-31 19:49:11

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]
查看完整版本: C语言和设计模式(享元模式)