You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时基于配置组合不同类方法实现的优化方案咨询

问题描述

现有一个任务执行系统,原设计中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:20:56