使用c语言实现一个装饰模式
时间: 2024-05-03 17:17:51 浏览: 8
装饰模式是一种结构型设计模式,它允许动态地将新功能添加到现有对象中,而不影响其他对象的工作。使用装饰模式,可以将一个对象的行为包装在另一个对象中,然后使用客户端代码来“装饰”原始对象。
在C语言中,实现装饰模式可以使用指针和函数指针。具体地,可以定义一个基本对象的结构体,然后定义一系列“装饰器”结构体,每个装饰器结构体嵌套一个指向基本对象结构体的指针和一些可选的函数指针。装饰器结构体的函数指针可以覆盖基本对象的原始函数,从而扩展其功能。
下面是一个简单的示例代码:
```
#include <stdio.h>
/* 基本对象结构体 */
struct object {
int value;
};
/* 装饰器结构体 */
struct decorator {
struct object* obj;
void (*print_value)(struct decorator*);
void (*add_one)(struct decorator*);
};
/* 实现装饰器的函数 */
void print_value(struct decorator* d) {
printf("Value: %d\n", d->obj->value);
}
void add_one(struct decorator* d) {
d->obj->value += 1;
}
/* 创建基本对象和装饰器 */
struct object* create_object() {
struct object* obj = malloc(sizeof(struct object));
obj->value = 0;
return obj;
}
struct decorator* create_decorator(struct object* obj) {
struct decorator* dec = malloc(sizeof(struct decorator));
dec->obj = obj;
dec->print_value = &print_value;
dec->add_one = &add_one;
return dec;
}
int main() {
/* 创建基本对象 */
struct object* obj = create_object();
/* 创建装饰器 */
struct decorator* dec1 = create_decorator(obj);
struct decorator* dec2 = create_decorator(obj);
/* 使用装饰器 */
dec1->add_one(dec1);
dec1->print_value(dec1);
dec2->add_one(dec2);
dec2->add_one(dec2);
dec2->print_value(dec2);
/* 释放内存 */
free(obj);
free(dec1);
free(dec2);
return 0;
}
```
在这个示例中,首先定义了一个基本对象结构体 `struct object`,其中包含一个整数型变量 `value`。然后定义了一个装饰器结构体 `struct decorator`,其中嵌套一个指向基本对象结构体的指针 `obj`,以及两个函数指针 `print_value` 和 `add_one`。
接下来定义了两个函数 `print_value` 和 `add_one`,它们分别用于打印对象的值和增加对象的值。
然后定义了两个工厂函数 `create_object` 和 `create_decorator`,用于创建基本对象和装饰器对象。
在主函数中,首先创建一个基本对象 `obj`,然后使用 `create_decorator` 函数创建了两个装饰器对象 `dec1` 和 `dec2`,它们都指向同一个基本对象 `obj`。
然后分别使用 `add_one` 函数和 `print_value` 函数对装饰器对象进行操作,并输出结果。
最后释放内存。