15 装饰器

三十四.装饰器

  1.开闭原则: 对功能的扩展开放,对代码的修改是封闭的(不可修改的)

     目的:在目标函数前或后插入一段新的代码,不改变源代码

  2.装饰器的通用语法

  3.多个装饰器修饰同一个函数

  4.带参数的修饰器

  语法格式:

实例:

转载于:https://www.cnblogs.com/lw1095950124/p/10197811.html

<think>好的,我现在需要回答用户关于如何在C语言中实现装饰器模式的问题。首先,装饰器模式通常用于动态地为对象添加功能,而C语言没有面向对象的特性,比如继承和多态,所以实现起来会比较复杂。用户提供的引用中提到了结构体嵌套和传递额外参数的方法,我需要结合这些信息来构建答案。 首先,我应该明确装饰器模式的核心概念,即通过组合而非继承来扩展功能。在C语言中,结构体可以用来封装原始对象和新增功能。然后,需要定义函数指针来模拟方法调用。例如,引用[1]提到使用结构体封装原始对象和额外功能,引用[4]中的C++例子用到了继承,但C语言只能用结构体组合。 接下来,我需要考虑如何组织结构体。比如,一个装饰器结构体可能包含一个指向原始对象的指针,以及新增的数据。函数方面,每个装饰器需要实现原始对象的方法,并在调用前后添加新行为,类似引用[3]中的C++装饰器在函数前后输出信息。 然后,具体步骤可能包括定义组件接口(结构体和函数指针)、具体组件实现、装饰器结构体包含组件指针,以及具体装饰器的实现。例如,引用[4]中的Warrior类和装饰器类,转换为C语言的话,可能需要用结构体保存基础攻击力,装饰器结构体包含基础对象并添加额外攻击力。 还需要注意C语言的限制,比如没有类,所以函数指针需要显式传递结构体参数。同时,内存管理需要注意,因为装饰器可能需要动态分配结构体。 最后,用户可能需要一个示例代码,展示如何创建组件、装饰它,并调用方法。参考引用[3]和[4]的例子,可以构造一个C语言的版本,比如战士攻击力的装饰器,添加火焰或冰冻效果。 总结步骤:定义组件结构体,定义装饰器结构体包含组件指针,实现装饰器的函数,在函数中调用原始函数并添加新功能。同时,在回答中需要提到C语言的限制,如手动管理内存、没有多态等,以及可能的优化方法,如使用宏简化代码。</think>在C语言中实现装饰器模式需要通过结构体组合和函数指针模拟面向对象特性,主要采用以下步骤: ### 一、核心实现原理 装饰器模式通过**嵌套结构体**实现功能扩展,原始对象作为装饰器的成员存在。每个装饰器需要保持与原始对象相同的接口规范[^1][^5],具体流程如下: 1. 定义基础组件接口(结构体+函数指针) 2. 创建具体组件实现 3. 定义装饰器结构体(包含基础组件指针) 4. 实现装饰器的功能扩展方法 ### 二、具体实现示例 以游戏角色攻击力系统为例,实现火焰攻击装饰器: ```c /* 基础组件定义 */ typedef struct Character { int (*get_attack)(struct Character*); } Character; /* 具体角色实现 */ typedef struct Warrior { Character base; int base_attack; } Warrior; int warrior_attack(Character* self) { return ((Warrior*)self)->base_attack; } /* 装饰器基类 */ typedef struct CharacterDecorator { Character base; Character* wrapped; // 被装饰对象指针 } CharacterDecorator; /* 火焰攻击装饰器 */ typedef struct FireDecorator { CharacterDecorator dec_base; int fire_bonus; } FireDecorator; int fire_attack(Character* self) { FireDecorator* dec = (FireDecorator*)self; int base = dec->dec_base.wrapped->get_attack(dec->dec_base.wrapped); return base + dec->fire_bonus; // 原始攻击+火焰加成 } /* 使用示例 */ int main() { Warrior warrior = { .base = { warrior_attack }, .base_attack = 10 }; FireDecorator fire_dec = { .dec_base = { .base = { fire_attack }, .wrapped = &warrior.base }, .fire_bonus = 5 }; Character* player = (Character*)&fire_dec; printf("Total Attack: %d", player->get_attack(player)); // 输出15 } ``` ### 三、实现要点说明 1. **结构体嵌套**:装饰器通过包含`Character`基类实现接口统一,通过`wrapped`指针持有被装饰对象[^1][^4] 2. **动态组合**:运行时通过指针组合不同装饰器,比编译时继承更灵活[^5] 3. **函数指针映射**:通过强制类型转换实现多态效果,需要严格保持函数签名一致 4. **内存管理**:需要手动管理装饰器对象的生命周期,建议使用工厂函数创建装饰器 ### 四、C语言实现限制 1. **类型安全**:依赖强制类型转换,缺乏编译期类型检查 2. **多装饰器组合**:需要逐层包装对象,代码复杂度较高 3. **内存管理**:装饰器对象需要显式释放,建议采用引用计数机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值