Skip to content

Commit e78e605

Browse files
author
Jarry
committed
add mediator for c
1 parent c836a85 commit e78e605

40 files changed

+963
-169
lines changed

iterator-pattern/README.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,5 +228,96 @@ func (o *ObjectList) Get(index int) string {
228228
}
229229
```
230230

231+
## C语言简版
232+
233+
```c
234+
#include <stdio.h>
235+
#include <stdlib.h>
236+
237+
// 简单版C语言迭代器模式,自己构建List数据类型
238+
239+
// 数据结构,这里使用链表作为示例
240+
struct List
241+
{
242+
char *data;
243+
struct List *next;
244+
};
245+
246+
// 迭代器结构体
247+
struct Iterator
248+
{
249+
struct List *current;
250+
int (*has_next)(struct Iterator *); // 判断是否还有下一个元素
251+
char *(*next)(struct Iterator *, char **); // 获取下一个元素
252+
};
253+
254+
// 判断是否还有下一个元素
255+
int has_next(struct Iterator *iter)
256+
{
257+
return iter->current != NULL;
258+
}
259+
260+
// 获取下一个元素
261+
char *next(struct Iterator *iter, char **value)
262+
{
263+
if (iter->current == NULL)
264+
{
265+
return NULL;
266+
}
267+
*value = iter->current->data;
268+
iter->current = iter->current->next;
269+
return *value;
270+
}
271+
272+
// 初始化迭代器
273+
void create_iterator(struct Iterator *iter, struct List *head)
274+
{
275+
iter->current = head;
276+
iter->has_next = &has_next;
277+
iter->next = &next;
278+
}
279+
280+
// 遍历链表
281+
void iterate_list(struct List *head)
282+
{
283+
struct Iterator iter;
284+
char *value;
285+
create_iterator(&iter, head);
286+
while (iter.has_next(&iter))
287+
{
288+
iter.next(&iter, &value);
289+
printf("\r\n %s ", value);
290+
}
291+
printf("\n");
292+
}
293+
294+
int main()
295+
{
296+
printf("test start:\r\n");
297+
// 构造一个链表
298+
struct List *head = (struct List *)malloc(sizeof(struct List));
299+
head->data = "Tom";
300+
head->next = (struct List *)malloc(sizeof(struct List));
301+
head->next->data = "Jerry";
302+
head->next->next = (struct List *)malloc(sizeof(struct List));
303+
head->next->next->data = "Max";
304+
head->next->next->next = NULL;
305+
306+
// 使用迭代器遍历链表
307+
iterate_list(head);
308+
309+
// 释放链表内存
310+
while (head != NULL)
311+
{
312+
struct List *temp = head;
313+
head = head->next;
314+
free(temp);
315+
}
316+
317+
return 0;
318+
}
319+
320+
```
321+
231322
## 更多语言版本
232323
不同语言实现设计模式:[https://github.com/microwind/design-pattern](https://github.com/microwind/design-pattern)

iterator-pattern/c/src/object_list.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
#include "func.h"
22

3-
void set_objects(ObjectList *object_list, char **objects, int len)
3+
void object_list_set_objects(ObjectList *object_list, char **objects, int len)
44
{
55
object_list->length = len;
66
object_list->objects = objects;
77
}
88

9-
char **get_objects(ObjectList *object_list)
9+
char **object_list_get_objects(ObjectList *object_list)
1010
{
1111
return object_list->objects;
1212
}
1313

14-
char *get(ObjectList *object_list, int index)
14+
char *object_list_get(ObjectList *object_list, int index)
1515
{
1616
return object_list->objects[index];
1717
}
@@ -30,9 +30,9 @@ ObjectList *object_list_constructor()
3030
ObjectList *list = (ObjectList *)obj;
3131
list->objects = NULL;
3232
list->length = 0;
33-
list->set_objects = &set_objects;
34-
list->get_objects = &get_objects;
35-
list->get=&get;
33+
list->set_objects = &object_list_set_objects;
34+
list->get_objects = &object_list_get_objects;
35+
list->get=&object_list_get;
3636
list->create_iterator = &create_iterator;
3737
return list;
3838
}

0 commit comments

Comments
 (0)