运行时基于配置组合不同类方法实现的优化方案咨询
问题描述
现有一个任务执行系统,原设计中TaskDoer依赖TaskDriverA完成所有任务。现在需要基于配置,让部分任务可以切换到TaskDriverB的实现,但TaskDriverB仅覆盖少量任务,大部分任务仍需使用TaskDriverA。
最初尝试在TaskDoer中添加分支逻辑,但因存在多个TaskDoer,转而设计TaskDispatcher统一调度,但TaskDispatcher需要手动实现大量转发到TaskDriverA的方法,冗余度极高,急需更简洁的扩展方案。
优化方案
推荐使用委托模式结合动态方法转发,配合配置映射表来解决冗余问题,同时保证扩展性:
1. 动态方法转发(利用__getattr__)
在TaskDispatcher中重写__getattr__方法,当调用未显式定义的任务方法时,自动转发到TaskDriverA,无需手动编写大量重复方法。
2. 配置映射表
将任务与驱动的对应关系通过配置映射表管理,避免硬编码分支判断,便于后续新增TaskDriverB的任务实现。
示例代码
class Configuration: def __init__(self, way_to_do_task_1_3_5, way_to_do_task_2): self.way_to_do_task_1_3_5 = way_to_do_task_1_3_5 self.way_to_do_task_2 = way_to_do_task_2 # 可扩展更多任务配置 class TaskDriverA: def do_task1(self): print("TaskDriverA: do_task1") def do_task2(self): print("TaskDriverA: do_task2") def do_task32(self): print("TaskDriverA: do_task32") def do_task33(self): print("TaskDriverA: do_task33") # 其他大量任务方法... class TaskDriverB: def do_task1(self): print("TaskDriverB: do_task1") def do_task2(self): print("TaskDriverB: do_task2") # 后续可新增更多任务方法... class TaskDispatcher: def __init__(self, configuration): self.configuration = configuration self.driver_a = TaskDriverA() self.driver_b = TaskDriverB() # 建立任务-驱动映射规则,key为任务方法名,value为判断逻辑 self.task_driver_map = { "do_task1": lambda: self.driver_a if configuration.way_to_do_task_1_3_5 == "A" else self.driver_b, "do_task2": lambda: self.driver_a if configuration.way_to_do_task_2 == "A" else self.driver_b, # 后续新增任务配置只需在这里添加 } def __getattr__(self, name): # 检查是否有自定义的任务映射 if name in self.task_driver_map: driver = self.task_driver_map[name]() return getattr(driver, name) # 无映射的任务,默认转发到TaskDriverA return getattr(self.driver_a, name) class TaskDoer: def __init__(self, configuration): self.dispatcher = TaskDispatcher(configuration) def do_tasks(self): self.dispatcher.do_task1() self.dispatcher.do_task2() self.dispatcher.do_task32() self.dispatcher.do_task33() # 其他任务调用... # 使用示例 config = Configuration(way_to_do_task_1_3_5="B", way_to_do_task_2="A") doer = TaskDoer(config) doer.do_tasks()
方案优势
- 消除冗余代码:无需手动编写大量转发到
TaskDriverA的方法,__getattr__自动处理默认转发。 - 扩展性强:后续新增
TaskDriverB的任务实现,只需在task_driver_map中添加对应的映射规则即可,无需修改TaskDoer或其他代码。 - 逻辑清晰:任务与驱动的对应关系集中在映射表中,便于维护和修改。
内容的提问来源于stack exchange,提问作者5up3rc001dud3
相关产品推荐
相关产品推荐

