用设计模式实现完以后我突然发现,所谓的设计模式其实在C语言里不就是链表吗?当前节点能处理就处理不能处理让下一个节点处理,不多说,上代码
消息类的设计
message.h
#ifndef MESSAGE_H
#define MESSAGE_H
#define TRUE 1
#define FALSE 0
typedef struct {
int sender;
int isSend;
int isCharge;
char date ;
}Message;
Message * makeMessage(const int sender, const char *date);
void setSendFlag(Message * const message);
void setChargeFlag(Message * const message);
int isSameDate(const Message * const message, const char * const date);
char * format(const Message * const message);
const char * boolStr(const int value);
#endif
message.c
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "message.h"
Message * makeMessage(const int sender, const char *date)
{
Message *message = (Message*)malloc(sizeof(Message));
assert(message != NULL);
message->sender = sender;
message->isSend = FALSE;
message->isCharge = FALSE;
strncpy(message->date, date, 8);
return message;
}
const char * boolStr(const int value)
{
return value == TRUE "TRUE" : "FALSE";
}
char * format(const Message * const message)
{
#define BUF_SIZE 1024
static char buffer[BUF_SIZE];
memset(&buffer, 0, BUF_SIZE);
snprintf((char*)&buffer, BUF_SIZE, "Message <%d isSend:%s isCharge:%s>\n", \
message->sender, boolStr(message->isSend), boolStr(message->isCharge));
return (char*)buffer;
}
void setSendFlag(Message * const message)
{
message->isSend = TRUE;
}
void setChargeFlag(Message * const message)
{
message->isCharge = TRUE;
}
int isSameDate(const Message * const message, const char * const date)
{
if (strncmp(message->date, date, 8) == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
testMessage.c
#include <stdio.h>
#include "message.h"
#include "gtest/gtest.h"
TEST(MESSAGE,makeMessage){
Message *message = makeMessage(1,"20131212");
EXPECT_EQ(1, message->sender);
EXPECT_STREQ("Message <1 isSend:FALSE isCharge:FALSE>\n", format(message));
}
链表类的实现
node.h
#ifndef NOTE_H
#define NOTE_H
typedef struct Node{
void *ptr;
struct Node *next;
}Node;
Node *makeListWithArray(void *array[], int length);
void foreach(Node *list, void (*process) (Node *));
#endif
node.c
#include <stdlib.h>
#include <assert.h>
#include "node.h"
Node *makeListWithArray(void *array[], int length)
{
int i;