1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
| from abc import ABC, abstractmethod from typing import Optional, List from dataclasses import dataclass
@dataclass class Event: """事件数据""" type: str data: dict handled: bool = False
class EventHandler(ABC): """事件处理者基类"""
def __init__(self, name: str): self.name = name self._next_handler: Optional[EventHandler] = None
def set_next(self, handler: 'EventHandler') -> 'EventHandler': """设置下一个处理者""" self._next_handler = handler return handler
def handle(self, event: Event) -> Event: """处理事件""" if self.can_handle(event): print(f"{self.name}: 正在处理事件 {event.type}") event = self.process(event)
if not event.handled and self._next_handler: return self._next_handler.handle(event)
return event
def can_handle(self, event: Event) -> bool: """判断是否能处理该事件""" return event.type in self.get_supported_types()
@abstractmethod def get_supported_types(self) -> List[str]: """返回支持的事件类型""" pass
@abstractmethod def process(self, event: Event) -> Event: """处理事件的具体逻辑""" pass
class MouseEventHandler(EventHandler): """鼠标事件处理者"""
def get_supported_types(self) -> List[str]: return ['click', 'double_click', 'hover']
def process(self, event: Event) -> Event: x = event.data.get('x', 0) y = event.data.get('y', 0)
print(f" 处理鼠标事件: 坐标({x}, {y})")
if event.type == 'click': print(f" 触发点击处理逻辑") event.handled = True elif event.type == 'double_click': print(f" 触发双击处理逻辑") event.handled = True
return event
class KeyboardEventHandler(EventHandler): """键盘事件处理者"""
def get_supported_types(self) -> List[str]: return ['key_press', 'key_release']
def process(self, event: Event) -> Event: key = event.data.get('key', '')
print(f" 处理键盘事件: 按键 {key}")
if key == 'Escape': print(f" ESC键按下,关闭窗口") event.handled = True
return event
class LogEventHandler(EventHandler): """日志记录处理者"""
def get_supported_types(self) -> List[str]: return ['*']
def process(self, event: Event) -> Event: print(f" [日志] 记录事件: {event.type}, 数据: {event.data}") return event
class UIEventHandler(EventHandler): """UI事件处理者"""
def get_supported_types(self) -> List[str]: return ['click', 'resize', 'close']
def process(self, event: Event) -> Event: print(f" UI响应: {event.type}")
if event.type == 'close': print(f" 关闭窗口") event.handled = True
return event
def main(): mouse_handler = MouseEventHandler("MouseHandler") keyboard_handler = KeyboardEventHandler("KeyboardHandler") log_handler = LogEventHandler("LogHandler") ui_handler = UIEventHandler("UIHandler")
mouse_handler.set_next(keyboard_handler).set_next(ui_handler).set_next(log_handler)
print("=== 测试1: 点击事件 ===") event1 = Event(type='click', data={'x': 100, 'y': 200}) mouse_handler.handle(event1) print()
print("=== 测试2: 键盘事件 ===") event2 = Event(type='key_press', data={'key': 'Escape'}) mouse_handler.handle(event2) print()
print("=== 测试3: 未知事件 ===") event3 = Event(type='custom', data={'value': 123}) mouse_handler.handle(event3)
if __name__ == "__main__": main()
|