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

我实现的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:42:03