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

如何在Python中用策略模式重构多if-elif分支的解析逻辑?

基于策略模式的可扩展数据处理实现

1. 定义抽象解析器接口

用Python的abc模块创建抽象基类,强制所有解析器遵循统一的process方法规范:

from abc import ABC, abstractmethod

class BaseParser(ABC):
    @abstractmethod
    def process(self, data):
        pass

2. 实现具体解析器类

每种格式对应独立的解析器类,专注于自身的解析逻辑,符合单一职责原则:

class JSONParser(BaseParser):
    def process(self, data):
        return f"Parsing JSON: {data}"

class XMLParser(BaseParser):
    def process(self, data):
        return f"Parsing XML: {data}"

class CSVParser(BaseParser):
    def process(self, data):
        return f"Parsing CSV: {data}"

3. 实现动态注册与调度逻辑

用类装饰器实现解析器的自动注册,核心的DataProcessor仅负责根据格式类型匹配对应解析器,彻底消除if-elif链:

class DataProcessor:
    _parsers = {}  # 存储格式类型到解析器实例的映射

    @classmethod
    def register_parser(cls, format_type):
        def decorator(parser_cls):
            cls._parsers[format_type] = parser_cls()
            return parser_cls
        return decorator

    def process(self, format_type, data):
        parser = self._parsers.get(format_type)
        if not parser:
            raise ValueError(f"Unsupported format: {format_type}")
        return parser.process(data)

4. 注册解析器

通过装饰器将解析器与对应的格式类型绑定,写法简洁直观:

@DataProcessor.register_parser("json")
class JSONParser(BaseParser):
    def process(self, data):
        return f"Parsing JSON: {data}"

@DataProcessor.register_parser("xml")
class XMLParser(BaseParser):
    def process(self, data):
        return f"Parsing XML: {data}"

@DataProcessor.register_parser("csv")
class CSVParser(BaseParser):
    def process(self, data):
        return f"Parsing CSV: {data}"

5. 使用示例

processor = DataProcessor()
print(processor.process("json", "{'key': 'value'}"))  # 输出: Parsing JSON: {'key': 'value'}
print(processor.process("xml", "<root><item>test</item></root>"))  # 输出: Parsing XML: <root><item>test</item></root>

6. 新增格式无需修改核心代码

如果要支持YAML等新格式,只需要新增解析器并注册,完全不用改动DataProcessor:

@DataProcessor.register_parser("yaml")
class YAMLParser(BaseParser):
    def process(self, data):
        return f"Parsing YAML: {data}"

# 直接使用新格式
print(processor.process("yaml", "key: value"))  # 输出: Parsing YAML: key: value

方案优势

  • 开闭原则:新增格式仅需添加新类,无需修改现有核心代码
  • 无硬编码分支:通过动态注册和字典映射实现策略选择,避免冗长的if-elif
  • 职责分离:每个解析器只处理对应格式,DataProcessor仅负责调度
  • 灵活扩展:支持运行时动态注册/移除解析器

内容的提问来源于stack exchange,提问作者Yevhen Ivashchenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:25:01