python: Reactor Pattern

项目结构:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:49
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : constants.py
 
from enum import Enum
 
class BusinessEventType(Enum):
    """
    珠宝行业全部业务事件类型枚举,统一管理
    """
    RAW_MATERIAL = "raw_material"      # 原料采购验收
    PROCESS_CHECK = "process_check"    # 加工质检
    STORE_SALE = "sale"                # 门店销售结算
    AFTER_SALE_REPAIR = "repair"       # 售后维修
    INVENTORY_CHECK = "inventory"      # 库存盘点
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:49
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : exceptions.py
 
class HandlerNotFoundError(Exception):
    """
    事件无对应处理器异常
    """
    pass
 
class InvalidEventDataError(Exception):
    """
    事件请求数据非法异常
    """
    pass
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:50
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : logger.py
 
import logging
import sys
 
def get_logger(name: str = "jewelry_reactor") -> logging.Logger:
    """
 
    :param name:
    :return:
    """
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    if not logger.handlers:
        fmt = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S")
        sh = logging.StreamHandler(sys.stdout)
        sh.setFormatter(fmt)
        logger.addHandler(sh)
    return logger
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:53
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : base_handler.py
from abc import ABC, abstractmethod
from ReactorPattern.event import BusinessEvent
 
class BaseHandler(ABC):
    """
    所有业务处理器抽象基类,统一规范接口
    """
    @abstractmethod
    def handle(self, event: BusinessEvent) -> None:
        """
        处理对应业务事件
        :param event:
        :return:
        """
        pass
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:54
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : material_handler.py
from .base_handler import BaseHandler
from ReactorPattern.event import BusinessEvent
from ReactorPattern.common import get_logger
 
logger = get_logger("material_handler")
 
class MaterialAcceptHandler(BaseHandler):
    """
    原料采购
    """
    def handle(self, event: BusinessEvent) -> None:
        """
 
        :param event:
        :return:
        """
        payload = event.payload
        mat_type = payload["material_type"]
        purity = payload["purity"]
        weight = payload["weight"]
        logger.info(f"===== 原料采购验收业务开始 =====")
        logger.info(f"原料:{mat_type} | 纯度:{purity} | 重量:{weight}g")
        logger.info(f"{mat_type}原料验收合格,入库完成")
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:56
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : process_handler.py
from .base_handler import BaseHandler
from ReactorPattern.event import BusinessEvent
from ReactorPattern.common import get_logger
 
logger = get_logger("process_handler")
 
class ProcessCheckHandler(BaseHandler):
    """
    加工质检
    """
    def handle(self, event: BusinessEvent) -> None:
        """
 
        :param event:
        :return:
        """
        payload = event.payload
        style = payload["style"]
        cert_no = payload["cert_no"]
        craft = payload["craft"]
        logger.info(f"===== 珠宝加工质检业务开始 =====")
        logger.info(f"款式:{style} | GIA证书号:{cert_no} | 工艺标准:{craft}")
        logger.info(f"{style}工艺、证书全部合规,成品入库")
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:57
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : sale_handler.py
from .base_handler import BaseHandler
from ReactorPattern.event import BusinessEvent
from ReactorPattern.common import get_logger
 
logger = get_logger("sale_handler")
 
class StoreSaleHandler(BaseHandler):
    """
    门店销售结算
    """
    def handle(self, event: BusinessEvent) -> None:
        """
 
        :param event:
        :return:
        """
        payload = event.payload
        product = payload["product_name"]
        price = payload["unit_price"]
        qty = payload["quantity"]
        order_id = payload["order_id"]
        total = price * qty
        logger.info(f"===== 门店销售结算业务开始 =====")
        logger.info(f"商品:{product} | 单价:{price}元 | 数量:{qty}件")
        logger.info(f"订单{order_id},结算总价:{total}元,销售完成")
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:58
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : repair_handler.py
from .base_handler import BaseHandler
from ReactorPattern.event import BusinessEvent
from ReactorPattern.common import get_logger
 
logger = get_logger("repair_handler")
 
class AfterSaleRepairHandler(BaseHandler):
    """
    售后维修
    """
    def handle(self, event: BusinessEvent) -> None:
        """
 
        :param event:
        :return:
        """
        payload = event.payload
        customer = payload["customer_name"]
        jewel = payload["jewelry_name"]
        item = payload["repair_item"]
        logger.info(f"===== 售后维修业务开始 =====")
        logger.info(f"客户:{customer} | 饰品:{jewel} | 维修项目:{item}")
        logger.info(f"{item}服务完工,客户可取件")
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 20:59
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : inventory_handler.py
from .base_handler import BaseHandler
from ReactorPattern.event import BusinessEvent
from ReactorPattern.common import get_logger
 
logger = get_logger("inventory_handler")
 
class InventoryCheckHandler(BaseHandler):
    """
    库存盘点
    """
    def handle(self, event: BusinessEvent) -> None:
        """
 
        :param event:
        :return:
        """
        payload = event.payload
        inv_type = payload["inventory_type"]
        total_num = payload["total_num"]
        total_val = payload["total_value"]
        logger.info(f"===== 库存盘点业务开始 =====")
        logger.info(f"盘点类目:{inv_type} | 在库总数:{total_num}件 | 库存总价值:{total_val}万元")
        logger.info(f"账实核对一致,库存台账更新完成")
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 21:00
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : demultiplexer.py
 
from typing import Dict
from ReactorPattern.common import BusinessEventType, HandlerNotFoundError
from ReactorPattern.handler import BaseHandler
 
class EventDemultiplexer:
    """
    事件分离器:维护事件类型与处理器映射,负责匹配分发
    """
    def __init__(self):
        self._handler_map: Dict[BusinessEventType, BaseHandler] = {}
 
    def register_handler(self, event_type: BusinessEventType, handler: BaseHandler) -> None:
        """
        注册事件与处理器绑定关系,扩展新增业务只需要注册
        :param event_type:
        :param handler:
        :return:
        """
        self._handler_map[event_type] = handler
 
    def get_handler(self, event_type: BusinessEventType) -> BaseHandler:
        """
        根据事件类型查找对应处理器,无则抛异常
        :param event_type:
        :return:
        """
        if event_type not in self._handler_map:
            raise HandlerNotFoundError(f"未注册处理器:{event_type.value}")
        return self._handler_map[event_type]
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 21:02
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : reactor_core.py
from ReactorPattern.event import BusinessEvent
from ReactorPattern.reactor import EventDemultiplexer
from ReactorPattern.common import get_logger
 
logger = get_logger("reactor_core")
 
class JewelryReactor:
    """
    珠宝行业Reactor反应器,统一接收并发事件、调用分离器分发
    """
    def __init__(self, demultiplexer: EventDemultiplexer):
        self._demux = demultiplexer
 
    def dispatch(self, event: BusinessEvent) -> None:
        """
        对外统一入口:接收任意业务事件,自动分发处理
        :param event:
        :return:
        """
        logger.info(f"Reactor收到业务事件:{event.event_type.value}")
        handler = self._demux.get_handler(event.event_type)
        handler.handle(event)
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 21:05
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : app.py
from .common import BusinessEventType, get_logger
from .event import BusinessEvent
from .reactor import EventDemultiplexer, JewelryReactor
from .handler import (
    MaterialAcceptHandler,
    ProcessCheckHandler,
    StoreSaleHandler,
    AfterSaleRepairHandler,
    InventoryCheckHandler
)
 
logger = get_logger("app")
 
def build_reactor() -> JewelryReactor:
    """
    依赖组装:统一注册所有业务处理器,工厂化构建Reactor
    :return:
    """
    demux = EventDemultiplexer()
    # 注册所有珠宝业务处理器
    demux.register_handler(BusinessEventType.RAW_MATERIAL, MaterialAcceptHandler())
    demux.register_handler(BusinessEventType.PROCESS_CHECK, ProcessCheckHandler())
    demux.register_handler(BusinessEventType.STORE_SALE, StoreSaleHandler())
    demux.register_handler(BusinessEventType.AFTER_SALE_REPAIR, AfterSaleRepairHandler())
    demux.register_handler(BusinessEventType.INVENTORY_CHECK, InventoryCheckHandler())
    reactor = JewelryReactor(demultiplexer=demux)
    return reactor
 
def simulate_concurrent_business_requests(reactor: JewelryReactor):
    """
    模拟多并发业务请求,统一封装为标准Event对象送入Reactor
    :param reactor:
    :return:
    """
    event_list = [
        BusinessEvent(
            event_type=BusinessEventType.RAW_MATERIAL,
            payload={"material_type": "足金999", "purity": "99.9%", "weight": 800}
        ),
        BusinessEvent(
            event_type=BusinessEventType.PROCESS_CHECK,
            payload={"style": "1克拉钻戒", "cert_no": "GIA987654321", "craft": "微镶精工"}
        ),
        BusinessEvent(
            event_type=BusinessEventType.STORE_SALE,
            payload={"product_name": "古法传承金镯", "unit_price": 15680, "quantity": 1, "order_id": "JEW20260615001"}
        ),
        BusinessEvent(
            event_type=BusinessEventType.AFTER_SALE_REPAIR,
            payload={"customer_name": "李女士", "jewelry_name": "18K金项链", "repair_item": "断裂焊接+抛光翻新"}
        ),
        BusinessEvent(
            event_type=BusinessEventType.INVENTORY_CHECK,
            payload={"inventory_type": "钻石成品库存", "total_num": 1680, "total_value": 12600}
        )
    ]
    # 循环推送所有并发事件给Reactor分发
    for evt in event_list:
        reactor.dispatch(evt)

调用:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Reactor  Pattern 反应器模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/15 21:07
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : ReactorBll.py
from ReactorPattern.common import get_logger
from ReactorPattern.reactor import JewelryReactor
from ReactorPattern.app import build_reactor, simulate_concurrent_business_requests
 
logger = get_logger("ReactorBll")
 
class ReactorBll(object):
    """
    Reactor 业务逻辑封装层
    对外提供统一调用入口,隐藏内部构建、分发、调度细节
    """
    def __init__(self):
        # 内部初始化 Reactor 实例(一次创建,多次复用)
        self._reactor: JewelryReactor = build_reactor()
 
    def demo(self):
        """
        对外演示方法:一键执行全套珠宝行业并发业务流程
        :return: None
        """
        logger.info("========== ReactorBll.demo() 开始执行 ==========")
        # 执行并发业务模拟
        simulate_concurrent_business_requests(self._reactor)
        logger.info("========== ReactorBll.demo() 执行完成 ==========")
 
    def get_reactor(self) -> JewelryReactor:
        """
        提供内部 reactor 实例,方便外部扩展调用(可选)
        """
        return self._reactor

输出:

相关推荐
1024+1 小时前
在 ‌Ubuntu 24.04‌ 上安装 ‌Python 3.8‌
linux·python·ubuntu
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月15日
大数据·人工智能·python·信息可视化·自然语言处理
CS_SKILL1 小时前
吉比特 C++ 实习一面面经:一轮把 C++、容器、并发、排序和网络全扫了一遍
java·开发语言·校招面经·实习面经·技术面经·吉比特校招
feifeigo1231 小时前
基于多混沌映射的图像加密(MATLAB实现)
开发语言·matlab
techdashen1 小时前
Go 语言仓库 Top 100 贡献者分析报告
开发语言·后端·golang
何以解忧,唯有..1 小时前
Go 语言变量命名规范详解
开发语言·后端·golang
某林2121 小时前
从 Isaac Lab API 踩坑到硬件 MVP 的全链路实战破局
python·机器人·人机交互·ros2
专注搞钱1 小时前
Python自动爬设备报警日志,每天省1小时
开发语言·python·半导体
2601_961963381 小时前
Spring Boot集成电子签章的7个典型问题与解决方案:从入门到生产级实践
大数据·人工智能·spring boot·python·区块链·智能合约