一、事件是什么(官方严谨定义)
事件是 ABAP 面向对象中,类与类之间实现松耦合通信的机制。
- 一个类可以定义事件、触发事件
- 其他类可以注册监听这个事件
- 事件触发后,系统自动调用注册好的处理方法
- 触发方不关心谁处理,处理方不关心谁触发→ 完全解耦
简单举例:闹钟响起,人”听到“闹钟响起会自动起床;假设定义闹钟类具备闹钟响起的功能,定义人“类”具备起床的功能,那么”听到”则把”闹钟“和”人类“的功能绑定起来,
- 定义事件:我是一个闹钟,我具备一个功能:某个时间点会响铃(ring)
- 触发事件:时间到!我响铃了!
- 注册监听:人准备听到闹钟
- 响应事件:人听到这个闹钟响,我就起床
二、事件三要素(固定结构)
- 触发类:定义事件 + 触发事件(RAISE EVENT)
- 处理类:编写事件处理方法
- 注册监听:SET HANDLER 绑定事件与处理方法
三、示例
示例代码:
REPORT ztest_alarm_event. *----------------------------------------------------------------------* * 1. 【闹钟类】事件发出者:会响铃 *----------------------------------------------------------------------* CLASS lcl_alarm DEFINITION. PUBLIC SECTION. EVENTS: ring. " 1️⃣ 定义事件:闹钟响了 METHODS: start. " 闹钟启动 ENDCLASS. CLASS lcl_alarm IMPLEMENTATION. METHOD start. WRITE: / '闹钟:时间到!叮铃铃~~~'. RAISE EVENT ring. " 2️⃣ 触发事件(响铃) ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * 2. 【人类】事件处理者:听到铃声就起床 *----------------------------------------------------------------------* CLASS lcl_person DEFINITION. PUBLIC SECTION. METHODS: get_up FOR EVENT ring OF lcl_alarm. " 3️⃣ 事件处理方法 ENDCLASS. CLASS lcl_person IMPLEMENTATION. METHOD get_up. WRITE: / '我:听到闹钟,起床上班啦!'. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * 3. 主程序:把它们绑定在一起 *----------------------------------------------------------------------* START-OF-SELECTION. " 创建对象 DATA(lo_alarm) = NEW lcl_alarm( ). DATA(lo_person) = NEW lcl_person( ). " 4️⃣ 注册监听:人监听闹钟 SET HANDLER lo_person->get_up FOR lo_alarm. " 启动闹钟 → 自动响铃 → 人自动起床 lo_alarm->start( ).运行结果:
四、事件 vs 普通方法调用(为什么要用事件?)
表格
| 方式 | 耦合度 | 调用关系 | 适用场景 |
|---|---|---|---|
| 普通方法调用 | 高耦合 | A 直接调用 B | 明确知道要调用谁 |
| 事件 | 低耦合 | A 触发,B 监听 | 不知道谁处理、多人处理 |
事件优势
- 触发方和处理方互不依赖
- 可一对多通知
- 代码更易扩展、更符合 Clean Core