适配器模式C语言实现
【说明】适配器模式的C语言实现,改写自http://blog.csdn.net/sx_wpc/article/details/7688128一文的代码。
【代码清单】
typedef.h
#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include <stdio.h>#include <stdlib.h>#ifdef __cplusplusextern "C" {#endiftypedef enum _Ret{RET_OK,RET_FAIL}Ret;#define return_if_fail(p)\if(!(p)){\printf("%s:%d Warning:"#p"Failed\n",__func__,__LINE__);\return;}#define return_val_if_fail(p, ret)\if(!(p)){\printf("%s:%d Warning:"#p"Failed\n",__func__,__LINE__);\return (ret);}#define SAFE_FREE(p) if(p != NULL){free(p); p = NULL;}#ifdef __cplusplus}#endif#endif
player.h
#ifndef __PLAYER_H__#define __PLAYER_H__#include "typedef.h"#ifdef __cplusplusextern "C" {#endifstruct _Player;typedef struct _Player Player;struct _Player{char *name;void (*attack)(void *player);void (*defend)(void *player);void (*destroy)(void *player);};static inline void player_attack(Player *thiz){return_if_fail(thiz != NULL);if(thiz->attack != NULL){thiz->attack(thiz);}}static inline void player_defend(Player *thiz){return_if_fail(thiz != NULL);if(thiz->defend != NULL){thiz->defend(thiz);}}static inline void player_destroy(Player *thiz){return_if_fail(thiz != NULL);if(thiz->destroy != NULL){thiz->destroy(thiz);}}#ifdef __cplusplus}#endif#endif
forwardsplayer.h
#ifndef __FORWARDSPLAYER_H__#define __FORWARDSPLAYER_H__#include "player.h"#ifdef __cplusplusextern "C" {#endifstruct _Forwards;typedef struct _Forwards Forwards;struct _Forwards{Player player;};Forwards *ForwardsCreate(char *name);#ifdef __cplusplus}#endif#endif
forwardsplayer.c
#include <stdio.h>#include <stdlib.h>#include "forwardsplayer.h"static void forwards_attack(void *thiz){printf("前锋 %s 进攻\n", ((Forwards *)thiz)->player.name);}static void forwards_defend(void *thiz){printf("前锋 %s 防守\n", ((Forwards *)thiz)->player.name);}static void forwards_destroy(void *thiz){return_if_fail(thiz != NULL);SAFE_FREE(thiz);}Forwards *ForwardsCreate(char *name){Forwards *thiz = malloc(sizeof(Forwards));if(thiz != NULL){thiz->player.name = name;thiz->player.attack = forwards_attack;thiz->player.defend = forwards_defend;thiz->player.destroy = forwards_destroy;}//printf("%s\n", thiz->player->name);return thiz;}
centerplayer.h
#ifndef __CENTERPLAYER_H__#define __CENTERPLAYER_H__#include "player.h"#ifdef __cplusplusextern "C" {#endifstruct _Center;typedef struct _Center Center;struct _Center{Player player;};Center *CenterCreate(char *name);#ifdef __cplusplus}#endif#endif
centerplayer.c
#include <stdio.h>#include <stdlib.h>#include "centerplayer.h"static void center_attack(void *thiz){printf("中锋 %s 进攻\n", ((Center *)thiz)->player.name);}static void center_defend(void *thiz){printf("中锋 %s 防守\n", ((Center *)thiz)->player.name);}static void center_destroy(void *thiz){return_if_fail(thiz != NULL);SAFE_FREE(thiz);}Center *CenterCreate(char *name){Center *thiz = malloc(sizeof(Center));if(thiz != NULL){thiz->player.name = name;thiz->player.attack = center_attack;thiz->player.defend = center_defend;thiz->player.destroy = center_destroy;}return thiz;}
guardsplayer.h
#ifndef __GUARDSPLAYER_H__#define __GUARDSPLAYER_H__#include "player.h"#ifdef __cplusplusextern "C" {#endifstruct _Guards;typedef struct _Guards Guards;struct _Guards{Player player;};Guards *GuardsCreate(char *name);#ifdef __cplusplus}#endif#endif
guardsplayer.c
#include <stdio.h>#include <stdlib.h>#include "guardsplayer.h"static void guards_attack(void *thiz){printf("后卫 %s 进攻\n", ((Guards *)thiz)->player.name);}static void guards_defend(void *thiz){printf("后卫 %s 防守\n", ((Guards *)thiz)->player.name);}static void guards_destroy(void *thiz){return_if_fail(thiz != NULL);SAFE_FREE(thiz);}Guards *GuardsCreate(char *name){Guards *thiz = malloc(sizeof(Guards));if(thiz != NULL){thiz->player.name = name;thiz->player.attack = guards_attack;thiz->player.defend = guards_defend;thiz->player.destroy = guards_destroy;}return thiz;}
foreigncenterplayer.h
#ifndef __FORIGNCENTERPLAYER_H__#define __FORIGNCENTERPLAYER_H__#include "typedef.h"#ifdef __cplusplusextern "C" {#endifstruct _ForeignCenter;typedef struct _ForeignCenter ForeignCenter;struct _ForeignCenter{char *name;void (*fattack)(void *player);void (*fdefend)(void *player);void (*fdestroy)(void *player);};void foreign_center_attack(void *thiz);void foreign_center_defend(void *thiz);void foreign_center_destroy(void *thiz);#ifdef __cplusplus}#endif#endif
foreigncenterplayer.c
#include <stdio.h>#include <stdlib.h>#include "foreigncenterplayer.h"void foreign_center_attack(void *thiz){printf("外籍中锋 %s 进攻\n", ((ForeignCenter *)thiz)->name);}void foreign_center_defend(void *thiz){printf("外籍中锋 %s 防守\n", ((ForeignCenter *)thiz)->name);}void foreign_center_destroy(void *thiz){return_if_fail(thiz != NULL);SAFE_FREE(thiz);}static ForeignCenter *ForeignCenterCreate(char *name){ForeignCenter *thiz = malloc(sizeof(ForeignCenter));if(thiz != NULL){thiz->name = name;thiz->fattack = foreign_center_attack;thiz->fdefend = foreign_center_defend;thiz->fdestroy = foreign_center_destroy;}return thiz;}
foreigncenteradapter.h
#ifndef __FORIGNCENTERADAPTER_H__#define __FORIGNCENTERADAPTER_H__#include "player.h"#ifdef __cplusplusextern "C" {#endifstruct _ForeignCenterAdapter;typedef struct _ForeignCenterAdapter ForeignCenterAdapter;struct _ForeignCenterAdapter{Player player;};ForeignCenterAdapter *ForeignCenterAdapterCreate(char *name);#ifdef __cplusplus}#endif#endif
foreigncenteradapter.c
#include <stdio.h>#include <stdlib.h>#include "foreigncenterplayer.h"#include "foreigncenteradapter.h"static void foreign_center_adapter_attack(void *thiz){foreign_center_attack(thiz);}static void foreign_center_adapter_defend(void *thiz){foreign_center_defend(thiz);}static void foreign_center_adapter_destroy(void *thiz){foreign_center_destroy(thiz);}ForeignCenterAdapter *ForeignCenterAdapterCreate(char *name){ForeignCenterAdapter *thiz = malloc(sizeof(ForeignCenterAdapter));if(thiz != NULL){thiz->player.name = name;thiz->player.attack = foreign_center_adapter_attack;thiz->player.defend = foreign_center_adapter_defend;thiz->player.destroy = foreign_center_adapter_destroy;}return thiz;}
test.c
#include <stdio.h>#include <stdlib.h>#include "player.h"#include "forwardsplayer.h"#include "centerplayer.h"#include "guardsplayer.h"#include "foreigncenteradapter.h"int main(int argc, char **argv){Player *a = (Player *)CenterCreate("姚明");player_attack(a);Player *b = (Player *)ForeignCenterAdapterCreate("巴蒂尔");player_defend(b);player_attack(b);player_destroy(a);player_destroy(b);return 0;}
Makefile
exe:=testtemp := $(wildcard test *~) all:test.c player.h foreigncenteradapter.h foreigncenteradapter.c foreigncenterplayer.h foreigncenterplayer.c forwardsplayer.h forwardsplayer.c centerplayer.h centerplayer.c guardsplayer.h guardsplayer.c typedef.hgcc -g $^ -o $(exe)clean:rm $(temp)
【源码下载】
*欢迎纠错,共同进步!
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.csdn.net/tandesir