
装饰器(Decorator)是一种强大的元编程工具,它通过一种声明式的方式,为代码赋予新的行为或特性,而无需修改其源代码。在不同的技术栈中,装饰器有着不同的实现和应用,但其核心思想是统一的:增强、扩展、管理。
装饰器核心概念
装饰器:代码的"外挂"
装饰器就像给手机加装功能强大的外挂,它不会改变手机打电话的核心功能,但可以为其增加全新的能力,如游戏加速、AI助手等。这种增强是动态的、可插拔的。
装饰器本质上是一个函数,它接收目标(如函数、类、属性)作为参数,并返回一个修改后的版本。在实际应用中,它常被用来:
- **插入横切关注点:**在不修改原代码的情况下,为函数添加日志、权限校验、性能计时等功能。
- **实现设计模式:**例如,在Java中,装饰器模式(Decorator Pattern)通过组合方式动态地给对象添加职责。
- **声明式编程:**在ArkTS等框架中,装饰器用于声明组件、管理状态,让开发者以更简洁的语法描述应用的结构和行为。
Python 装饰器:函数功能的"增强器"
Python 是最早广泛采用装饰器语法的主流语言之一,它为函数和类提供了强大的功能扩展能力。
常见内置装饰器
@property: 将方法转换为属性,实现对属性的访问控制。
@lru_cache: 自动缓存函数的返回值,避免重复计算。
**@functools.wraps:**在自定义装饰器中保持原函数的元数据。
自定义装饰器示例
以下是一个简单的计时装饰器,用于测量函数执行时间。
python
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行耗时: {end - start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(2)
slow_function()
ArkTS 装饰器:HarmonyOS 声明式UI的"引擎"
ArkTS(Ark TypeScript)是 HarmonyOS 的官方应用开发语言,其装饰器体系是构建声明式UI的核心。ArkTS 的装饰器主要分为四大类,每类解决特定的开发问题。
1. 组件定义类装饰器
这类装饰器用于定义和标记UI组件的结构和角色。
| 装饰器 | 作用 | 使用场景 |
|---|---|---|
| @Component | 标记一个自定义组件 | 构建可复用的UI单元 |
| @Entry | 标记应用的入口组件 | 每个页面有且仅有一个 |
| @Preview | 用于DevEco Studio预览 | 开发调试阶段 |
2. 状态管理与数据传递装饰器
这是ArkTS装饰器体系中最核心、最复杂的部分,用于管理应用的状态和数据流。
| 装饰器 | 作用 | 使用场景 |
|---|---|---|
| @State | 组件内部状态 | 计数器、开关等局部状态 |
| @Prop | 父→子单向传递 | 父组件向子组件传递数据 |
| @Link | 父子双向绑定 | 子组件修改影响父组件 |
| @Provide/@Consume | 跨层级共享数据 | 主题切换、用户信息等 |
| @Observed/@ObjectLink | 复杂对象响应式 | 对象属性变化触发更新 |
3. 存储与持久化装饰器
这类装饰器用于将状态与应用的持久化存储(如Preferences)关联起来,实现数据的保存和读取。
| 装饰器 | 作用 | 使用场景 |
|---|---|---|
| @StorageProp | 从全局存储读取只读属性 | 用户ID、配置常量等 |
| @StorageLink | 从全局存储读写共享数据 | 登录状态、语言选择等 |
| @LocalStorageProp/@LocalStorageLink | 页面内局部状态共享 |
4. UI构建与样式装饰器
这类装饰器用于构建和复用UI结构与样式,提升代码的可维护性。
| 装饰器 | 作用 | 使用场景 |
|---|---|---|
| @Builder | 定义可复用的UI片段 | 将重复的UI结构抽象为方法 |
| @Styles | 定义可复用的样式集合 | 统一应用的UI风格 |
| @Extend | 扩展已有组件的样式 | 为内置组件添加自定义样式 |
ArkTS 装饰器速查表
为了方便您快速查阅,这里将ArkTS的核心装饰器及其功能总结如下:
| 装饰器 | 作用域 | 核心功能 |
|---|---|---|
| @Component | struct | 声明一个UI组件 |
| @Entry | struct | 标记页面入口组件 |
| @State | 属性 | 组件内部状态 |
| @Prop | 属性 | 父→子单向传递 |
| @Link | 属性 | 父子双向绑定 |
| @Provide/@Consume | 属性 | 跨层级共享数据 |
| @Observed/@ObjectLink | class/属性 | 复杂对象响应式 |
| @StorageProp/@StorageLink | 属性 | 全局存储读写 |
| @LocalStorageProp/@LocalStorageLink | 属性 | 局部存储读写 |
| @Builder | 方法 | 定义可复用UI片段 |
| @Styles/@Extend | 方法 | 定义和扩展样式 |
| @Preview | struct | 开发者预览组件 |