策略模式实现问题:无法调用子类方法的技术咨询
问题分析与解决方案
你确实误用了策略模式,同时代码里存在几个关键错误导致调用结果不符合预期:
核心问题
策略模式的核心是将具体算法封装为独立的策略类,与使用策略的上下文(如翻译器)解耦。但你的代码把策略方法和翻译器子类混在一起,同时错误地用抽象类的类方法作为策略参数,导致调用的是抽象类的空实现(返回None),而非子类的方法。
具体错误点
- 策略与上下文耦合:把翻译方法(
translate_in_french等)放在了Translator子类中,违背了策略模式“策略独立封装”的原则。 - 方法签名不匹配:抽象基类中用了
@classmethod定义抽象方法,但子类中实现的是实例方法,无法正确覆盖父类的类方法。 - 错误传递策略:你传入的
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
相关产品推荐
相关产品推荐

