百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

30天学会Python编程:24. Python设计模式与架构

ccwgpt 2025-07-06 09:42 2 浏览 0 评论

24.1 设计模式基础

24.1.1 设计模式分类

24.1.2 SOLID原则

原则

全称

核心思想

SRP

单一职责

一个类只做一件事

OCP

开闭原则

对扩展开放,修改关闭

LSP

里氏替换

子类可替换父类

ISP

接口隔离

客户端不应依赖不需要的接口

DIP

依赖倒置

依赖抽象而非实现

24.2 创建型模式

24.2.1 工厂模式

from abc import ABC, abstractmethod

class PaymentMethod(ABC):
    """支付方式抽象类"""
    @abstractmethod
    def pay(self, amount):
        pass

class CreditCard(PaymentMethod):
    def pay(self, amount):
        print(f"信用卡支付 {amount} 元")

class Alipay(PaymentMethod):
    def pay(self, amount):
        print(f"支付宝支付 {amount} 元")

class PaymentFactory:
    """支付工厂"""
    @staticmethod
    def create(method: str) -> PaymentMethod:
        if method == 'credit':
            return CreditCard()
        elif method == 'alipay':
            return Alipay()
        raise ValueError(f"不支持的支付方式: {method}")

# 使用示例
payment = PaymentFactory.create('alipay')
payment.pay(100)

24.2.2 单例模式

class DatabaseConnection:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 初始化数据库连接
            cls._instance.conn = "模拟数据库连接"
        return cls._instance
    
    def query(self, sql):
        print(f"执行查询: {sql}")
        return "结果数据"

# 测试单例
db1 = DatabaseConnection()
db2 = DatabaseConnection()
print(db1 is db2)  # True

24.3 结构型模式

24.3.1 适配器模式

class OldSystem:
    """旧系统接口"""
    def legacy_request(self, data: dict):
        print(f"旧系统处理: {data}")

class NewSystem:
    """新系统期望的接口"""
    def json_request(self, json_str: str):
        print(f"新系统处理: {json_str}")

class Adapter(NewSystem):
    """适配器转换旧系统接口"""
    def __init__(self, old_system: OldSystem):
        self.old_system = old_system
    
    def json_request(self, json_str: str):
        import json
        data = json.loads(json_str)
        self.old_system.legacy_request(data)

# 客户端代码
def client_code(system: NewSystem):
    system.json_request('{"key": "value"}')

old = OldSystem()
adapter = Adapter(old)
client_code(adapter)  # 通过适配器调用旧系统

24.3.2 装饰器模式

from functools import wraps

def log_execution(func):
    """记录函数执行的装饰器"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"开始执行 {func.__name__}")
        result = func(*args, **kwargs)
        print(f"完成执行 {func.__name__}")
        return result
    return wrapper

def validate_input(func):
    """验证参数的装饰器"""
    @wraps(func)
    def wrapper(text: str):
        if not isinstance(text, str):
            raise ValueError("输入必须是字符串")
        return func(text)
    return wrapper

@log_execution
@validate_input
def process_text(text):
    """处理文本"""
    return text.upper()

# 使用装饰后的函数
print(process_text("hello"))  # 正常执行
# process_text(123)          # 触发验证错误

24.4 行为型模式

24.4.1 观察者模式

class Subject:
    """被观察者"""
    def __init__(self):
        self._observers = []
    
    def attach(self, observer):
        self._observers.append(observer)
    
    def detach(self, observer):
        self._observers.remove(observer)
    
    def notify(self, data):
        for observer in self._observers:
            observer.update(data)

class Observer(ABC):
    """观察者抽象类"""
    @abstractmethod
    def update(self, data):
        pass

class Logger(Observer):
    """日志观察者"""
    def update(self, data):
        print(f"[LOG] 状态变化: {data}")

class AlertSystem(Observer):
    """告警观察者"""
    def update(self, data):
        if data.get('warning'):
            print(f"[ALERT] 警告: {data['warning']}")

# 使用示例
subject = Subject()
subject.attach(Logger())
subject.attach(AlertSystem())

subject.notify({"status": "OK"})
subject.notify({"warning": "CPU过载"})

24.4.2 策略模式

from abc import ABC, abstractmethod

class CompressionStrategy(ABC):
    """压缩策略接口"""
    @abstractmethod
    def compress(self, data: bytes) -> bytes:
        pass

class ZipCompression(CompressionStrategy):
    def compress(self, data):
        print("使用ZIP算法压缩")
        return b"compressed_with_zip"

class RarCompression(CompressionStrategy):
    def compress(self, data):
        print("使用RAR算法压缩")
        return b"compressed_with_rar"

class FileCompressor:
    """文件压缩器"""
    def __init__(self, strategy: CompressionStrategy):
        self._strategy = strategy
    
    def set_strategy(self, strategy: CompressionStrategy):
        self._strategy = strategy
    
    def compress_file(self, file_path: str) -> bytes:
        with open(file_path, 'rb') as f:
            data = f.read()
        return self._strategy.compress(data)

# 使用示例
compressor = FileCompressor(ZipCompression())
compressor.compress_file("test.txt")

# 运行时切换策略
compressor.set_strategy(RarCompression())
compressor.compress_file("test.txt")

24.5 系统架构

24.5.1 分层架构

myapp/
├── presentation/   # 表现层
│   ├── web/
│   └── cli/
├── service/        # 业务逻辑层
│   ├── order.py
│   └── payment.py
├── repository/     # 数据访问层
│   ├── models.py
│   └── db.py
└── domain/         # 领域模型
    ├── entities.py
    └── value_objects.py

24.5.2 微服务通信

# 基于消息队列的通信
import pika

def publish_event(event):
    connection = pika.BlockingConnection(
        pika.ConnectionParameters('localhost')
    )
    channel = connection.channel()
    channel.queue_declare(queue='order_events')
    channel.basic_publish(
        exchange='',
        routing_key='order_events',
        body=json.dumps(event)
    )
    connection.close()

# 基于REST的通信
import requests

def get_user_info(user_id):
    response = requests.get(
        f"http://user-service/api/users/{user_id}",
        timeout=3
    )
    response.raise_for_status()
    return response.json()

24.6 应用举例

案例1:电商订单

from dataclasses import dataclass
from typing import List

@dataclass
class OrderItem:
    product_id: str
    quantity: int
    price: float

class Order:
    """订单领域模型"""
    def __init__(self, order_id: str, user_id: str):
        self.order_id = order_id
        self.user_id = user_id
        self._items: List[OrderItem] = []
        self._status = "created"
    
    def add_item(self, item: OrderItem):
        self._items.append(item)
    
    @property
    def total_amount(self):
        return sum(item.price * item.quantity for item in self._items)
    
    def checkout(self, payment_strategy):
        """策略模式应用"""
        payment_strategy.process(self.total_amount)
        self._status = "paid"
    
    def notify_observers(self, event):
        """观察者模式应用"""
        for observer in self._observers:
            observer.update(event)

class OrderService:
    """订单服务层"""
    def __init__(self, repository, notifier):
        self._repo = repository
        self._notifier = notifier
    
    def create_order(self, user_id, items):
        order = Order(str(uuid.uuid4()), user_id)
        for item in items:
            order.add_item(OrderItem(**item))
        
        self._repo.save(order)
        self._notifier.send(
            "order_created",
            {"order_id": order.order_id, "user_id": user_id}
        )
        return order

案例2:数据管道架构

from abc import ABC, abstractmethod
from concurrent.futures import ThreadPoolExecutor

class DataSource(ABC):
    """数据源抽象类"""
    @abstractmethod
    def read(self):
        pass

class Transformer(ABC):
    """数据转换抽象类"""
    @abstractmethod
    def transform(self, data):
        pass

class DataPipeline:
    """数据处理管道"""
    def __init__(self, source: DataSource, transformers: List[Transformer]):
        self.source = source
        self.transformers = transformers
        self.executor = ThreadPoolExecutor(max_workers=4)
    
    def process(self):
        """责任链模式处理数据"""
        raw_data = self.source.read()
        
        result = raw_data
        for transformer in self.transformers:
            result = self.executor.submit(transformer.transform, result).result()
        
        return result

# 具体实现
class CSVSource(DataSource):
    def read(self):
        print("从CSV读取数据")
        return [{"name": "Alice", "age": "25"}, {"name": "Bob", "age": "30"}]

class AgeToInt(Transformer):
    def transform(self, data):
        print("转换年龄为整数")
        for item in data:
            item['age'] = int(item['age'])
        return data

class AddTimestamp(Transformer):
    def transform(self, data):
        print("添加时间戳")
        for item in data:
            item['timestamp'] = datetime.now().isoformat()
        return data

# 构建管道
pipeline = DataPipeline(
    source=CSVSource(),
    transformers=[AgeToInt(), AddTimestamp()]
)
processed_data = pipeline.process()
print(processed_data)

24.7 知识图谱

24.8 学习总结

核心要点

  • 理解SOLID设计原则
  • 掌握常用设计模式
  • 区分架构层次职责
  • 合理应用模式组合

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #学习# #python# #在头条记录我的2025#


相关推荐

Java七大热门技术框架源码解析(25章) 完结

获课》aixuetang.xyz/5699/Hibernate与MyBatis源码级PK:ORM框架的两种哲学在Java持久层框架领域,Hibernate与MyBatis代表了两种截然不同的设计哲学。...

【25章】Java七大热门技术框架源码解析

获课》aixuetang.xyz/5699/Java高级面试:七大框架源码精讲与实战解析在当今Java技术生态中,对主流框架源码的深入理解已成为高级开发者面试的核心竞争力。掌握Spring、MyBat...

饿了么董事长吴泽明兼任CEO,韩鎏分管即时物流中心

饿了么调整组织架构。2月11日,饿了么董事长吴泽明(花名:范禹)通过公司全员信宣布饿了么最新组织调整:即日起,吴泽明将兼任饿了么CEO,韩鎏(花名:昊宸)专注分管即时物流中心,继续向吴泽明汇报。吴泽明...

饿了么100%迁至阿里云,快速扩容可支持1亿人同时点单

来源:环球网6月17日,记者获悉,饿了么已完成100%上云,所有业务系统、数据库设施等均已迁移至阿里云。高峰期,饿了么可在阿里云上快速扩容,可以支持1亿人同时在线点单,这意味着饿了么的服务能力再次全面...

饿了么组织架构调整:董事长吴泽明兼任CEO 韩鎏专注即时物流中心管理

近日,饿了么董事长吴泽明(花名:范禹)通过公司全员信宣布饿了么最新组织调整:即日起,吴泽明将兼任饿了么CEO,韩鎏(花名:昊宸)专注分管即时物流中心,继续向吴泽明汇报。吴泽明在内部信中表示,考虑即时物...

饿了么组织架构调整:董事长吴泽明兼任CEO

Tech星球2月11日消息,据新浪科技报道,今日饿了么董事长吴泽明(花名:范禹)通过公司全员信宣布饿了么最新组织调整:即日起,吴泽明将兼任饿了么CEO,韩鎏(花名:昊宸)专注分管即时物流中心,继续向吴...

饿了么又调整了组织架构,董事长吴泽明兼任CEO

2月11日,饿了么董事长,花名为范禹的吴泽明,通过公司全员信宣布最新组织调整:从即日起,吴泽明将兼任饿了么CEO。公司原CEO,花名为昊宸的韩鎏今后专注分管即时物流中心,继续向吴泽明汇报。在内部信中,...

SpringBoot项目快速开发框架JeecgBoot——Web处理!

Web处理JeecgBoot框架主要用于Web开发领域。下面介绍JeecgBoot在Web开发中的常用功能,如控制器、登录、系统菜单、权限模块的角色管理和用户管理。首先启动后台项目,将其导入IDE...

腾讯即将开源Kuikly:基于Kotlin的纯原生跨端解决方案

IT之家3月4日消息,腾讯日前在端服务网站发布预告,即将开源Kuikly跨端开发框架。预告海报介绍称,Kuikly是基于KotlinKMM技术、客户端开发友好的全新跨端解决方案,可...

Python构建MCP服务器完整教程:5步打造专属AI工具调用系统

模型控制协议(ModelControlProtocol,MCP)是一种专为实现AI代理与工具解耦而设计的通信协议,为AI驱动应用程序的开发提供了高度的灵活性和模块化架构。通过MCP服务器,AI代...

Python3使用diagrams生成架构图(python模块制作)

目录技术背景diagrams的安装基础逻辑关系图组件簇的定义总结概要参考链接技术背景对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能。这就像我们学习的时候整理的一些Xmi...

Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源

大数据文摘受权转载自AI前线整理|褚杏娟近期,HuggingFace低调开源了一个重磅ML框架:Candle。Candle一改机器学习惯用Python的做法,而是Rust编写,重...

Python Web 框架(Python Web 框架)

Tornado、Flask、Django三个PythonWeb框架的主要区别和适用场景:特点/框架TornadoFlaskDjango类型异步非阻塞Web服务器和框架轻量级微框架全功能...

构建并发布你的自定义 Python 包(python如何创建自定义模块)

Python让你可以重用代码,并将代码分享给他人以节省时间和精力。所以,当你编写了一些方便的脚本,希望你的同事或其他人也能使用时,接下来该怎么做呢?这篇文章就来解决打包和分发的问题。我们将专注于将你...

Python 应用开发框架 BeeWare 简明实用教程

1.BeeWare简介BeeWare是一个Python框架,用于开发跨平台原生应用。它支持Android、iOS、Windows、macOS和Linux,并提供原生用户体验。2.安装B...

取消回复欢迎 发表评论: