有没有一种简单的方法来代码ANSI C的战略(或其他)的设计模式,将适合的11 \”的MacBook

2019-10-16 17:54发布

这似乎在ANSI C OO是不是今天OO偏爱的方式。 有谁知道的方式使用严格的ANSI C,所以我可以证明给朋友,它可以编写一个简单的设计模式?(阿克塞尔 - 托比亚斯Schreiners的书让我去上这个!)

Answer 1:

OO用C的确可以使用函数指针作为解释的很好实现这太问题 。

使用从该职位的信息,这里是我将如何实现使用基本继承在C战略模式。

允许使用以下C ++作为指导:

class StrategyBase
{
    ...
    StrategyBase();
    virtual void strategyMethod() = 0;
    ...
};

class StrategyDerived
{
    ...
    StrategyDerived();
    void strategyMethod();
    ...
};

这里是对应的C代码:

typedef struct StrategyBase_t StrategyBase;
struct StrategyBase_t
{
    StrategyBase *base; /* must be first memeber */
    void (*strategyMethod)(const void *self);
};
StrategyBase *newStrategyBase();
void strategyMethod(const void *self);  /* the abstract method */

struct StrategyDerived
{
    StrategyBase *base; /* must be first memeber */
    void (*strategyMethod)(const void *self);
    /* more derived attributes here */
};
typedef struct StrategyDerived_t StrategyDerived;
StrategyDerived *newStrategyDerived();

这里是函数的实现:

void strategyMethod(const void *self)
{
    /* If called with just a StrategyBase, strategyMethod will be NULL, *
     * so perhaps some sort of protection should be added here first    */
    ((StrategyBase*) self)->base->strategyMethod();
}

void strategyMethodDerived(const void *self)
{
    /* Put your implementation here */
}

/* StrategyBase constructor */
StrategyBase *newStrategyBase()
{
    StrategyBase *self = (StrategyBase*) malloc(sizeof(StrategyBase));
    self->base = self; /* See comment below about virtual table */
    self->strategyMethod = NULL; /* StrategyBase is abstract, right? */
    return self;
}

/* StrategyDerived constructor */
StrategyDerived *newStrategyDerived()
{
    StrategyDerived *self = (StrategyDerived*) malloc(sizeof(StrategyDerived));
    self->base = newStrategyBase();
    self->strategyMethod = self->base->strategyMethod = strategyMethodDerived;
    return self;
}

虚表的实现是基本的,但应该工作。 理想的情况是,一些更强大的应予执行。

然后,你只需要使用一个指针StrategyBase中,需要一个战略一个结构,有你有一个策略模式实现在C.我还没有尝试编译它,但是这应该作为一个很好的起点。



Answer 2:

有没有什么不可以; 而不是类Foo ,使用一个struct foo ; 而不是一个构造Foo::Foo(...)有一个功能struct foo *foo_new(...)

对于现实生活中的例子,看到古老的GObject库 。



文章来源: Is there a simple way to code the strategy (or other) design pattern in ANSI C that would fit on the screen of an 11\" MacBook Air? [closed]