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

策略模式实现问题:无法调用子类方法的技术咨询

问题分析与解决方案

你确实误用了策略模式,同时代码里存在几个关键错误导致调用结果不符合预期:

核心问题

策略模式的核心是将具体算法封装为独立的策略类,与使用策略的上下文(如翻译器)解耦。但你的代码把策略方法和翻译器子类混在一起,同时错误地用抽象类的类方法作为策略参数,导致调用的是抽象类的空实现(返回None),而非子类的方法。

具体错误点

  1. 策略与上下文耦合:把翻译方法(translate_in_french等)放在了Translator子类中,违背了策略模式“策略独立封装”的原则。
  2. 方法签名不匹配:抽象基类中用了@classmethod定义抽象方法,但子类中实现的是实例方法,无法正确覆盖父类的类方法。
  3. 错误传递策略:你传入的TranslationStrategy.FRENCH是抽象类的类方法,和子类的实例方法没有关联,调用自然返回None。

修正后的代码(符合策略模式)

from abc import ABC, abstractmethod

# 策略接口:定义翻译行为的规范
class TranslationStrategy(ABC):
    @abstractmethod
    def translate(self, text: str) -> str:
        pass

# 具体策略:法语文学翻译
class FrenchLiteraryStrategy(TranslationStrategy):
    def translate(self, text: str) -> str:
        return "french_literary_translation"

# 具体策略:西班牙语文学翻译
class SpanishLiteraryStrategy(TranslationStrategy):
    def translate(self, text: str) -> str:
        return "spanish_literary_translation"

# 具体策略:法语技术翻译
class FrenchTechnicalStrategy(TranslationStrategy):
    def translate(self, text: str) -> str:
        return "french_technical_translation"

# 具体策略:西班牙语技术翻译
class SpanishTechnicalStrategy(TranslationStrategy):
    def translate(self, text: str) -> str:
        return "spanish_technical_translation"

# 上下文:翻译器,负责持有并使用策略
class Translator:
    def __init__(self, strategy: TranslationStrategy):
        self.strategy = strategy

    def get_translation(self, text: str) -> str:
        return self.strategy.translate(text)

# 使用示例
translator = Translator(FrenchTechnicalStrategy())
print(translator.get_translation("random string"))  # 输出 french_technical_translation

lit_translator = Translator(SpanishLiteraryStrategy())
print(lit_translator.get_translation("random string"))  # 输出 spanish_literary_translation

修正说明

  • 每个翻译策略都封装为独立类,实现统一的TranslationStrategy接口,符合“开闭原则”,新增策略只需添加新类即可。
  • 翻译器(上下文)仅负责持有策略实例并调用其方法,不关心具体翻译逻辑,实现了职责分离。
  • 调用时直接传入具体策略的实例,确保执行的是对应策略的翻译逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:10:39