适配器模式C语言实现

这篇博客介绍了如何用C语言实现适配器模式,提供了包括`forwardplayer`、`centerplayer`、`guardsplayer`、`foreigncenterplayer`以及适配器`foreigncenteradapter`的源码,并附带测试文件`test.c`和`Makefile`。作者鼓励读者下载源码进行学习和交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【说明】适配器模式的C语言实现,改写自http://blog.youkuaiyun.com/sx_wpc/article/details/7688128一文的代码。

【代码清单】

typedef.h

#ifndef __TYPEDEF_H__
#define __TYPEDEF_H__

#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef 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 __cplusplus
extern "C" {
#endif

struct _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 __cplusplus
extern "C" {
#endif

struct _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 __cplusplus
extern "C" {
#endif

struct _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 __cplusplus
extern "C" {
#endif

struct _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 __cplusplus
extern "C" {
#endif

struct _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 __cplusplus
extern "C" {
#endif

struct _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:=test
temp := $(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.h
	gcc -g $^ -o $(exe)

clean:
	rm $(temp)


【源码下载】

 

 

*欢迎纠错,共同进步!

 

转载请标明出处,仅供学习交流,勿用于商业目的

Copyright @ http://blog.youkuaiyun.com/tandesir

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值