我实现的Enum映射类代码模式是Strategy Pattern吗?是否为良好实践?
问题与解答
问题
我在重构Python代码时,设计出了一种不确定名称的模式(我对设计模式并不熟悉)。以下是该模式的抽象实现代码:
from abc import ABC, abstractmethod from enum import Enum class AbstractThing(ABC): @abstractmethod def do_something(self): pass class ConcreteThingOne(AbstractThing): def do_something(self): print("CONCRETETHINGONE DID SOMETHING IN A WAY CONCRETETHINGONE WOULD DO IT") class ConcreteThingTwo(AbstractThing): def do_something(self): print("concretethingtwo did something in a way concretethingtwo would do it") class ThingType(Enum): ONE = ConcreteThingOne TWO = ConcreteThingTwo def func_that_does_something_with_thing(thing_type: ThingType): thing: AbstractThing = thing_type.value() thing.do_something()
我不确定这是否属于某种设计模式,想请教:该模式是否为Strategy Pattern?它是否属于良好的编程实践?
我青睐该实现的原因如下:
- 将
thing_type设为Enum,能为代码使用者或其IDE提供可选值提示(相比使用字典的方式)。 - 将枚举名称映射至类,可省去编写factory时所需的大量boilerplate code(例如冗长繁琐的if-else分支)。
解答
是否属于策略模式?
不完全是,但和策略模式有核心相似点。
策略模式的核心是定义一系列可互换的行为(算法),并对每个行为进行封装,让使用方可以灵活切换。你的代码里AbstractThing定义了统一的行为接口,ConcreteThingOne和ConcreteThingTwo是不同的行为实现,这部分完全符合策略模式的特征。
但你额外用Enum来作为具体策略的选择器和实例创建入口,这其实是把简单工厂模式和策略模式结合了——Enum在这里扮演了轻量工厂的角色,负责创建具体策略的实例。所以你的实现是策略模式+简单工厂的变体,而非纯粹的策略模式。
是否属于良好的编程实践?
是的,这是非常实用的Python风格实现,你提到的两个优势确实是这个方案的核心价值:
- Enum提供了强类型约束,IDE能自动补全可选值,避免了用字符串或其他松散类型作为参数时的拼写错误,同时清晰界定了可选范围,可读性和维护性都更强。
- 用Enum映射类的方式替代了传统工厂的if-else分支,代码更简洁,后续新增
ConcreteThing子类时,只需要在Enum里添加一行映射即可,完全符合开闭原则。
小优化建议:
- 如果后续
ConcreteThing的初始化需要参数,可以直接在创建实例时传递,比如thing_type.value(arg1, arg2);如果参数逻辑复杂,也可以给Enum成员添加自定义方法来处理实例化逻辑。 - 如果未来策略类数量大幅增加,Enum可能会变得冗长,这时可以考虑用装饰器自动注册策略类到Enum或字典,但当前实现对于中小规模的策略场景已经足够好用。
内容的提问来源于stack exchange,提问作者scrapp
相关产品推荐
相关产品推荐

