Skip to content

Commit d854447

Browse files
author
Jarry
committed
add adapter for c
1 parent 2133e7b commit d854447

File tree

9 files changed

+351
-3
lines changed

9 files changed

+351
-3
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"func.h": "c",
1313
"vehicle.h": "c",
1414
"queue": "c",
15-
"stack": "c"
15+
"stack": "c",
16+
"filesystem": "c"
1617
}
1718
}

adapter-pattern/c/src/audio_player.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "func.h"
2+
3+
/* 具体播放器实现类 */
4+
5+
void audio_player_play(AudioPlayer *player)
6+
{
7+
printf("\r\n AudioPlayer::play() [file_type=%s, file_path=\"%s]",
8+
player->file_type, player->file_path);
9+
// audio playing
10+
}
11+
12+
// AudioPlayer的构造函数
13+
AudioPlayer *audio_player_constructor(char *file_type, char *file_path)
14+
{
15+
MediaPlayer *player = (MediaPlayer *)malloc(sizeof(MediaPlayer));
16+
strncpy(player->file_type, file_type, 20);
17+
strncpy(player->file_path, file_path, 1000);
18+
player->set_file_type = &set_player_file_type;
19+
player->set_file_path = &set_player_file_path;
20+
AudioPlayer *audio_player = (AudioPlayer *)player;
21+
audio_player->play = &audio_player_play;
22+
return audio_player;
23+
}

adapter-pattern/c/src/func.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
6+
// 通用视频播放接口,供各种播放器实现
7+
typedef struct MediaPlayer
8+
{
9+
char file_type[20];
10+
char file_path[1000];
11+
void (*set_file_type)(struct MediaPlayer *player, char *file_type);
12+
void (*set_file_path)(struct MediaPlayer *player, char *file_path);
13+
void (*play)(struct MediaPlayer *player);
14+
} MediaPlayer;
15+
void set_player_file_type(MediaPlayer *player, char *file_type);
16+
void set_player_file_path(MediaPlayer *player, char *file_path);
17+
18+
// mp4播放器
19+
typedef struct Mp4Player
20+
{
21+
char file_type[20];
22+
char file_path[1000];
23+
void (*set_file_type)(struct MediaPlayer *player, char *file_type);
24+
void (*set_file_path)(struct MediaPlayer *player, char *file_path);
25+
void (*play)(struct Mp4Player *player);
26+
} Mp4Player;
27+
Mp4Player *mp4_player_constructor(char *file_type, char *file_path);
28+
29+
// audio播放器
30+
typedef struct AudioPlayer
31+
{
32+
char file_type[20];
33+
char file_path[1000];
34+
void (*set_file_type)(struct MediaPlayer *player, char *file_type);
35+
void (*set_file_path)(struct MediaPlayer *player, char *file_path);
36+
void (*play)(struct AudioPlayer *player);
37+
} AudioPlayer;
38+
AudioPlayer *audio_player_constructor(char *file_type, char *file_path);
39+
40+
// hls播放器
41+
typedef struct HlsPlayer
42+
{
43+
char file_type[20];
44+
char file_path[1000];
45+
void (*set_file_type)(char *file_type);
46+
void (*set_file_path)(char *file_path);
47+
void (*play)(struct HlsPlayer *player);
48+
} HlsPlayer;
49+
HlsPlayer *hls_player_constructor(char *file_type, char *file_path);
50+
51+
// 适配器结构体,可以播放各种音频和视频,外部调用方式一样。
52+
typedef struct PlayerAdapter
53+
{
54+
char name[50];
55+
char media_type[20];
56+
void (* set_media_type)(struct PlayerAdapter *, char *);
57+
char file_type[20];
58+
void (* set_file_type)(struct PlayerAdapter *, char *);
59+
// 适配器里聚合了各种播放器
60+
Mp4Player *mp4_player;
61+
void (* set_mp4_player)(struct PlayerAdapter *, char *file_type, char *file_path);
62+
HlsPlayer *hls_player;
63+
void (* set_hls_player)(struct PlayerAdapter *, char *file_type, char *file_path);
64+
AudioPlayer *audio_player;
65+
void (* set_audio_player)(struct PlayerAdapter *, char *file_type, char *file_path);
66+
void (*play)(struct PlayerAdapter *);
67+
void (*init)(struct PlayerAdapter *, char *, char *, char *);
68+
} PlayerAdapter;
69+
PlayerAdapter *player_adapter_constructor(char *name);

adapter-pattern/c/src/hls_player.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "func.h"
2+
3+
/* 具体播放器实现类 */
4+
5+
void hls_player_play(HlsPlayer *player)
6+
{
7+
printf("\r\n HlsPlayer::play() [file_type=%s, file_path=\"%s]",
8+
player->file_type, player->file_path);
9+
// hls playing
10+
}
11+
12+
// HlsPlayer的构造函数
13+
HlsPlayer *hls_player_constructor(char *file_type, char *file_path)
14+
{
15+
MediaPlayer *player = (MediaPlayer *)malloc(sizeof(MediaPlayer));
16+
strncpy(player->file_type, file_type, 20);
17+
strncpy(player->file_path, file_path, 1000);
18+
player->set_file_type = &set_player_file_type;
19+
player->set_file_path = &set_player_file_path;
20+
HlsPlayer *hls_player = (HlsPlayer *)player;
21+
hls_player->play = &hls_player_play;
22+
return hls_player;
23+
}

adapter-pattern/c/src/media_player.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "func.h"
2+
3+
/* 通用视频播放接口 */
4+
5+
// 设置播放器的文件格式
6+
void set_player_file_type(MediaPlayer *player, char *file_type)
7+
{
8+
strncpy(player->file_type, file_type, 20);
9+
}
10+
11+
// 设置播放器的文件路径
12+
void set_player_file_path(MediaPlayer *player, char *file_path)
13+
{
14+
strncpy(player->file_path, file_path, 1000);
15+
}

adapter-pattern/c/src/mp4_player.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "func.h"
2+
3+
/* 具体播放器实现类 */
4+
5+
// mp4播放动作
6+
void mp4_player_play(Mp4Player *player)
7+
{
8+
printf("\r\n Mp4Player::play() [file_type=%s, file_path=\"%s]",
9+
player->file_type, player->file_path);
10+
// mp4 playing
11+
}
12+
13+
// Mp4Player的构造函数
14+
Mp4Player *mp4_player_constructor(char *file_type, char *file_path)
15+
{
16+
MediaPlayer *player = (MediaPlayer *)malloc(sizeof(MediaPlayer));
17+
strncpy(player->file_type, file_type, 20);
18+
strncpy(player->file_path, file_path, 1000);
19+
player->set_file_type = &set_player_file_type;
20+
player->set_file_path = &set_player_file_path;
21+
Mp4Player *mp4_player = (Mp4Player *)player;
22+
mp4_player->play = &mp4_player_play;
23+
return mp4_player;
24+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#include "func.h"
2+
3+
/* 适配器类,可以播放各种音频和视频,外部调用方式一样。 */
4+
5+
// 模拟构造函数,初始化时声明具体播放器
6+
void player_adapter_init(PlayerAdapter *adapter, char *media_type, char *file_type, char *file_path)
7+
{
8+
strncpy(adapter->media_type, media_type, 20);
9+
strncpy(adapter->file_type, file_type, 20);
10+
if (strcmp(media_type, "audio") == 0)
11+
{
12+
adapter->set_audio_player(adapter, file_type, file_path);
13+
}
14+
else if (strcmp(file_type, "mp4") == 0)
15+
{
16+
adapter->set_mp4_player(adapter, file_type, file_path);
17+
}
18+
else if (strcmp(file_type, "hls") == 0)
19+
{
20+
adapter->set_hls_player(adapter, file_type, file_path);
21+
}
22+
}
23+
24+
// 设置媒体类型
25+
void set_adapter_media_type(struct PlayerAdapter *adapter, char *media_type)
26+
{
27+
strncpy(adapter->media_type, media_type, 20);
28+
}
29+
30+
// 设置文件格式
31+
void set_adapter_file_type(struct PlayerAdapter *adapter, char *file_type)
32+
{
33+
strncpy(adapter->file_type, file_type, 20);
34+
}
35+
36+
// 设置音频播放器
37+
void set_adapter_audio_player(PlayerAdapter *adapter, char *file_type, char *file_path)
38+
{
39+
if (adapter->audio_player == NULL)
40+
{
41+
adapter->audio_player = audio_player_constructor(file_type, file_path);
42+
}
43+
else
44+
{
45+
adapter->audio_player->set_file_type((MediaPlayer *)adapter->audio_player, file_type);
46+
adapter->audio_player->set_file_path((MediaPlayer *)adapter->audio_player, file_path);
47+
}
48+
}
49+
50+
// 设置Mp4播放器
51+
void set_adapter_mp4_player(PlayerAdapter *adapter, char *file_type, char *file_path)
52+
{
53+
if (adapter->mp4_player == NULL)
54+
{
55+
adapter->mp4_player = mp4_player_constructor(file_type, file_path);
56+
}
57+
else
58+
{
59+
set_player_file_type((MediaPlayer *)adapter->mp4_player, file_type);
60+
set_player_file_path((MediaPlayer *)adapter->mp4_player, file_path);
61+
}
62+
}
63+
64+
// 设置hls播放器
65+
void set_adapter_hls_player(PlayerAdapter *adapter, char *file_type, char *file_path)
66+
{
67+
if (adapter->hls_player == NULL)
68+
{
69+
adapter->hls_player = hls_player_constructor(file_type, file_path);
70+
}
71+
else
72+
{
73+
set_player_file_type((MediaPlayer *)adapter->hls_player, file_type);
74+
set_player_file_path((MediaPlayer *)adapter->hls_player, file_path);
75+
}
76+
}
77+
78+
// 适配接口里的通用play函数,适配不同媒体文件
79+
void player_adapter_play(PlayerAdapter *adapter)
80+
{
81+
printf("\r\n PlayerAdapter::play() [adapter->name=%s, media_type=%s file_type=%s]",
82+
adapter->name, adapter->media_type, adapter->file_type);
83+
84+
if (strcmp(adapter->media_type, "audio") == 0)
85+
{
86+
adapter->audio_player->play(adapter->audio_player);
87+
}
88+
else if (strcmp(adapter->file_type, "mp4") == 0)
89+
{
90+
adapter->mp4_player->play(adapter->mp4_player);
91+
}
92+
else if (strcmp(adapter->file_type, "hls") == 0)
93+
{
94+
adapter->hls_player->play(adapter->hls_player);
95+
}
96+
else
97+
{
98+
printf("The media is not support. [media_type=%s, file_type=%s]", adapter->media_type, adapter->file_type);
99+
}
100+
}
101+
102+
// 适配器的构造函数
103+
PlayerAdapter *player_adapter_constructor(char *name)
104+
{
105+
printf("\r\n player_adapter_constructor() [name=%s]", name);
106+
PlayerAdapter *adapter = (PlayerAdapter *)malloc(sizeof(PlayerAdapter));
107+
strncpy(adapter->name, name, 20);
108+
adapter->audio_player = NULL;
109+
adapter->mp4_player = NULL;
110+
adapter->hls_player = NULL;
111+
adapter->set_media_type = &set_adapter_media_type;
112+
adapter->set_file_type = &set_adapter_file_type;
113+
adapter->set_mp4_player = &set_adapter_mp4_player;
114+
adapter->set_hls_player = &set_adapter_hls_player;
115+
adapter->set_audio_player = &set_adapter_audio_player;
116+
adapter->play = &player_adapter_play;
117+
adapter->init = &player_adapter_init;
118+
return adapter;
119+
}

adapter-pattern/c/test/test.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include "../src/func.h"
2+
3+
int main(void)
4+
{
5+
printf("test start:\r\n");
6+
/**
7+
* 适配器模式是当调用方需需调用不同功能,但接口并不兼容时,
8+
* 这时候可通过一个适配器类来做适配,让调用方通过适配类再去调用各个对象的功能。
9+
* 调用方只知道适配器,而不知道后面的其他对象。
10+
*/
11+
12+
// // mp4播放
13+
PlayerAdapter *player_adapter1 = player_adapter_constructor("adapter1");
14+
player_adapter1->init(player_adapter1, "video", "mp4", "d:/video.mp4");
15+
// 播放视频
16+
player_adapter1->play(player_adapter1);
17+
// 复用适配器实例,设置音频播放器,Mp4格式
18+
player_adapter1->set_media_type(player_adapter1, "audio");
19+
player_adapter1->set_file_type(player_adapter1, "mp4");
20+
player_adapter1->set_audio_player(player_adapter1, "mp4", "d:/audio.mp4");
21+
// 播放音频
22+
player_adapter1->play(player_adapter1);
23+
24+
// hls播放
25+
PlayerAdapter *player_adapter2 = player_adapter_constructor("adapter2");
26+
player_adapter2->init(player_adapter2, "video", "hls", "http://video.m3u8");
27+
player_adapter2->play(player_adapter2);
28+
29+
// mp3播放
30+
PlayerAdapter *player_adapter3 = player_adapter_constructor("adapter3");
31+
player_adapter3->init(player_adapter3, "audio", "mp3", "d:/audio.mp3");
32+
player_adapter3->play(player_adapter3);
33+
34+
// mp4音频播放
35+
PlayerAdapter *player_adapter4 = player_adapter_constructor("adapter3");
36+
player_adapter4->init(player_adapter4, "audio", "mp4", "d:/audio.mp4");
37+
player_adapter4->play(player_adapter4);
38+
// 复用实例播hls视频
39+
player_adapter4->set_media_type(player_adapter4, "video");
40+
player_adapter4->set_file_type(player_adapter4, "hls");
41+
player_adapter4->set_hls_player(player_adapter4, "hls", "d:/video.m3u8");
42+
player_adapter4->play(player_adapter4);
43+
44+
return 0;
45+
}
46+
47+
/**
48+
jarry@jarrys-MacBook-Pro c % gcc test/test.c src/*.c
49+
jarry@jarrys-MacBook-Pro c % ./a.out
50+
test start:
51+
52+
player_adapter_constructor() [name=adapter1]
53+
PlayerAdapter::play() [adapter->name=adapter1, media_type=video file_type=mp4]
54+
Mp4Player::play() [file_type=mp4, file_path="d:/video.mp4]
55+
PlayerAdapter::play() [adapter->name=adapter1, media_type=audio file_type=mp4]
56+
AudioPlayer::play() [file_type=mp4, file_path="d:/audio.mp4]
57+
player_adapter_constructor() [name=adapter2]
58+
PlayerAdapter::play() [adapter->name=adapter2, media_type=video file_type=hls]
59+
HlsPlayer::play() [file_type=hls, file_path="http://video.m3u8]
60+
player_adapter_constructor() [name=adapter3]
61+
PlayerAdapter::play() [adapter->name=adapter3, media_type=audio file_type=mp3]
62+
AudioPlayer::play() [file_type=mp3, file_path="d:/audio.mp3]
63+
player_adapter_constructor() [name=adapter3]
64+
PlayerAdapter::play() [adapter->name=adapter3, media_type=audio file_type=mp4]
65+
AudioPlayer::play() [file_type=mp4, file_path="d:/audio.mp4]
66+
PlayerAdapter::play() [adapter->name=adapter3, media_type=video file_type=hls]
67+
HlsPlayer::play() [file_type=hls, file_path="d:/video.m3u8]%
68+
*/

bridge-pattern/c/test/test.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ int main(void)
1919
// 调用具体类的扩充方法
2020
shape->draw_done(shape);
2121

22+
free(shape);
23+
free(draw_style_a);
24+
2225
/*********************** 分割线 ******************************************/
2326

2427
// 用具体对象声明对象,绑定具体的工具,传递的类型与抽象声明时的不同
@@ -30,12 +33,15 @@ int main(void)
3033
// 调用具体类的扩充方法
3134
shape2->draw_done(shape2);
3235

36+
free(shape2);
37+
free(draw_style_b);
38+
3339
return 0;
3440
}
3541

3642
/**
3743
jarry@jarrys-MacBook-Pro c % gcc test/test.c src/*.c
38-
jarry@jarrys-MacBook-Pro c % ./a.out
44+
jarry@jarrys-MacBook-Pro c % ./a.out
3945
test start:
4046
4147
refined_shape_constructor() [name=shape1]
@@ -47,5 +53,5 @@ test start:
4753
RefinedShape::set_draw_tool() [name=DrawStyleB1
4854
RefinedShape::draw() [x=11 y=22 radius=33]
4955
DrawStyleB::draw_style()
50-
RefinedShape::draw_done(), 执行的DrawTool是: DrawStyleB1%
56+
RefinedShape::draw_done(), 执行的DrawTool是: DrawStyleB1%
5157
*/

0 commit comments

Comments
 (0)