# Python 策略模式 (Strategy Pattern)
# Strategy 接口,运行时选择策略,策略注册表,验证策略
# -----------------------------------------------------------
# 策略模式定义一系列可互换的算法,使算法独立于使用它的
# 客户端。核心:策略接口 + 具体策略 + 策略上下文。
# -----------------------------------------------------------
from abc import ABC, abstractmethod
from typing import Any
# ===================== 策略接口 =====================
class ValidationStrategy(ABC):
@abstractmethod
def validate(self, data: dict) -> list[str]: ...
# ===================== 具体策略 =====================
class RequiredFieldStrategy(ValidationStrategy):
def __init__(self, fields: list[str]):
self._fields = fields
def validate(self, data: dict) -> list[str]:
return [f"{f} 为必填项" for f in self._fields
if f not in data or not data.get(f)]
class RangeStrategy(ValidationStrategy):
def __init__(self, field: str, min_v: float, max_v: float):
self._field = field; self._min = min_v; self._max = max_v
def validate(self, data: dict) -> list[str]:
v = data.get(self._field)
if v is not None:
try:
fv = float(v)
if fv < self._min or fv > self._max:
return [f"{self._field} 需在 {self._min}-{self._max}"]
except (ValueError, TypeError):
return [f"{self._field} 必须为数字"]
return []
class EmailStrategy(ValidationStrategy):
def validate(self, data: dict) -> list[str]:
email = data.get("email", "")
return ["邮箱格式无效"] if email and "@" not in email else []
class LengthStrategy(ValidationStrategy):
def __init__(self, field: str, min_l: int, max_l: int):
self._field = field; self._min = min_l; self._max = max_l
def validate(self, data: dict) -> list[str]:
val = str(data.get(self._field, ""))
if not (self._min <= len(val) <= self._max):
return [f"{self._field} 长度需 {self._min}-{self._max} 字符"]
return []
# ===================== 策略上下文 =====================
class Validator:
"""验证上下文:组合多个策略进行校验"""
def __init__(self):
self._strategies: list[ValidationStrategy] = []
def add(self, s: ValidationStrategy) -> "Validator":
self._strategies.append(s); return self
def validate(self, data: dict) -> list[str]:
errors = []
for s in self._strategies:
errors.extend(s.validate(data))
return errors
# ===================== 策略注册表 =====================
class StrategyRegistry:
"""按名称动态查找和创建策略"""
def __init__(self):
self._reg: dict[str, type[ValidationStrategy]] = {}
def register(self, n: str, s: type[ValidationStrategy]) -> None:
self._reg[n] = s
def create(self, n: str, **kw) -> ValidationStrategy:
cls = self._reg.get(n)
if cls is None:
raise ValueError(f"未知策略: {n}")
return cls(**kw)
if __name__ == "__main__":
v = Validator()
v.add(RequiredFieldStrategy(["name", "email", "age"])) \
.add(EmailStrategy()) \
.add(RangeStrategy("age", 18, 120)) \
.add(LengthStrategy("name", 2, 50))
errs = v.validate({"name": "A", "email": "bad", "age": "200"})
for e in errs:
print(f"验证失败: {e}")
Python策略模式应用
张小明
前端开发工程师
Mitmproxy进阶玩法:除了抓包,我这样用它做自动化测试和数据Mock
Mitmproxy进阶玩法:除了抓包,我这样用它做自动化测试和数据Mock当你还在用Mitmproxy简单地抓包调试时,一些技术团队已经将它变成了研发流程中的瑞士军刀。想象一下:凌晨三点的CI/CD流水线自动触发了数百个接口测试用例,…
Creality Print 6.0 技术深度解析:开源切片引擎的架构设计与性能优化策略
Creality Print 6.0 技术深度解析:开源切片引擎的架构设计与性能优化策略 【免费下载链接】CrealityPrint 项目地址: https://gitcode.com/gh_mirrors/cr/CrealityPrint Creality Print 6.0 作为基于成熟开源技术栈构建的3D打印切片软件,在继承O…
Cursor Free VIP深度解析:机器标识重置技术实现原理与实战指南
Cursor Free VIP深度解析:机器标识重置技术实现原理与实战指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …
AD7606采样率上不去?STM32F4 SPI+DMA+定时器中断实现稳定200KSPS采集的优化方案
AD7606极限采样实战:STM32F4 SPIDMA定时器中断实现200KSPS稳定采集在工业测量和高速数据采集领域,AD7606凭借其8通道同步采样和200KSPS的标称性能成为热门选择。但许多开发者发现,即使用上了STM32F4这类高性能MCU,实际采样率仍难以…
基于传感器快照标记与轻量化Transformer的室内高精度定位实践
1. 项目概述与核心挑战在工厂、大型仓库、购物中心这类复杂的室内环境中,实现高精度的设备定位一直是工业物联网和智慧服务领域的核心难题。这些环境通常被密集的货架、机器和墙体分割,导致无线信号传播路径被严重遮挡,形成所谓的“非视距”场…
从科幻到现实:基于等离子推进与氢能的高能动力系统原型设计
1. 项目概述:从科幻到现实的个人飞行动力探索钢铁侠的Mark 1战甲,那个在山洞里用边角料敲打出来的初代原型,点燃了无数人对个人飞行与高能动力系统的想象。作为一个在工程与物理领域深度钻研的爱好者,我始终被一个问题驱动&#x…