news 2026/5/30 15:40:58

Python策略模式应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python策略模式应用

# 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}")

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 15:38:46

Mitmproxy进阶玩法:除了抓包,我这样用它做自动化测试和数据Mock

Mitmproxy进阶玩法&#xff1a;除了抓包&#xff0c;我这样用它做自动化测试和数据Mock当你还在用Mitmproxy简单地抓包调试时&#xff0c;一些技术团队已经将它变成了研发流程中的瑞士军刀。想象一下&#xff1a;凌晨三点的CI/CD流水线自动触发了数百个接口测试用例&#xff0c…

作者头像 李华
网站建设 2026/5/30 15:37:18

Cursor Free VIP深度解析:机器标识重置技术实现原理与实战指南

Cursor Free VIP深度解析&#xff1a;机器标识重置技术实现原理与实战指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached …

作者头像 李华
网站建设 2026/5/30 15:35:13

基于传感器快照标记与轻量化Transformer的室内高精度定位实践

1. 项目概述与核心挑战在工厂、大型仓库、购物中心这类复杂的室内环境中&#xff0c;实现高精度的设备定位一直是工业物联网和智慧服务领域的核心难题。这些环境通常被密集的货架、机器和墙体分割&#xff0c;导致无线信号传播路径被严重遮挡&#xff0c;形成所谓的“非视距”场…

作者头像 李华
网站建设 2026/5/30 15:35:02

从科幻到现实:基于等离子推进与氢能的高能动力系统原型设计

1. 项目概述&#xff1a;从科幻到现实的个人飞行动力探索钢铁侠的Mark 1战甲&#xff0c;那个在山洞里用边角料敲打出来的初代原型&#xff0c;点燃了无数人对个人飞行与高能动力系统的想象。作为一个在工程与物理领域深度钻研的爱好者&#xff0c;我始终被一个问题驱动&#x…

作者头像 李华