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

python设计模式 综合应用与实战指南

off999 2025-09-06 10:19 43 浏览 0 评论

经过前面 16 章的学习,我们已系统掌握创建型模式(单例、工厂、建造者、原型)、结构型模式(适配器、桥接、组合、装饰器、外观、享元、代理)、行为型模式(责任链、命令、迭代器、中介者、观察者、状态、策略)的核心原理与实现方式。本章将聚焦 “设计模式的综合应用”,从模式选型、跨模式组合、实战项目分析三个维度,帮助你突破 “单个模式会用,但复杂场景不会组合” 的困境,真正将设计模式转化为解决实际问题的能力。

一、设计模式选型策略:如何匹配场景选对模式?

在实际项目中,设计模式的 “选型” 比 “实现” 更关键 —— 选对模式能简化设计、提升扩展性,选错模式则会增加复杂度。以下是基于业务场景的选型框架,涵盖常见需求与对应模式的匹配逻辑:

1.1 按 “核心需求” 选型

核心需求

适用模式

选型依据

典型场景

对象创建

工厂方法 / 抽象工厂

需屏蔽创建细节,或创建多系列对象

跨平台 UI 组件创建(抽象工厂)、数据库连接创建(工厂方法)


建造者模式

需分步构建复杂对象,或同一构建过程生成不同产品

订单对象构建(分步添加商品、优惠、收货信息)、文档生成(分步添加标题、正文、附件)


单例模式

系统中需唯一实例的对象

日志器、配置管理器、线程池


原型模式

需频繁创建相似对象,且创建成本高

复杂报表对象复制、游戏角色克隆

结构组织

适配器模式

需兼容已有接口,解决接口不兼容问题

集成第三方支付接口(适配不同支付 API)、旧系统改造(适配新接口)


桥接模式

系统存在多维度独立变化,需避免类爆炸

UI 组件 + 操作系统(按钮在 Windows/macOS 上的实现)、支付方式 + 订单类型(微信支付 + 实物订单 / 虚拟订单)


组合模式

需处理 “部分 - 整体” 树形结构,统一操作节点

文件系统(文件夹 + 文件)、组织架构(部门 + 员工)、菜单导航(一级菜单 + 二级菜单)


装饰器模式

需动态为对象添加功能,或组合多个功能

接口日志记录、权限校验、数据缓存(多装饰器组合)、咖啡配料添加(牛奶 + 糖 + 奶泡)


外观模式

需简化复杂子系统调用,降低客户端耦合

订单处理(库存 + 支付 + 物流 + 通知)、智能家居控制(灯光 + 空调 + 窗帘)


享元模式

需复用大量相似对象,减少内存占用

围棋棋子(共享颜色、形状,区分位置)、字符串常量池、缓存池


代理模式

需控制对象访问(权限、延迟加载、远程调用)

数据库查询缓存(缓存代理)、权限校验(保护代理)、远程服务调用(远程代理)

行为协作

责任链模式

需多节点依次处理请求,或动态调整处理流程

日志过滤(按级别过滤)、审批流程(部门经理→财务→总经理)、请求校验(参数校验→权限校验→业务处理)


命令模式

需封装请求(存储、撤销、队列执行),解耦发送者与执行者

遥控器控制家电(命令存储与执行)、文本编辑器撤销 / 重做、任务调度(定时执行命令)


迭代器模式

需统一遍历不同结构集合,隐藏内部实现

自定义容器遍历(书架、购物车)、树形结构遍历(前序、后序)


中介者模式

需减少多对象间网状耦合,集中管理交互

电商购物车(商品 + 库存 + 价格 + 优惠券)、聊天室(用户消息转发)、设备控制中心(多设备协同)


观察者模式

需实现 “一对多” 依赖,状态变化自动通知

新闻订阅(公众号→用户)、数据监控(指标变化→告警)、UI 刷新(数据变更→页面更新)


状态模式

需处理对象多状态行为,状态驱动行为变化

订单状态流转(待支付→已支付→已发货)、电梯运行(待机→上升→下降)、交通信号灯(红→黄→绿)


策略模式

需动态切换多算法,或封装独立算法

支付方式选择(支付宝 / 微信 / 银联)、排序算法切换(冒泡 / 快速 / 归并)、折扣计算(满减 / 折扣券 / 会员)

1.2 按 “项目阶段” 选型

  • 设计初期:优先考虑 “创建型模式” 与 “结构型模式”,搭建稳定的对象创建与结构框架(如用抽象工厂定义产品系列,用桥接模式分离多维度变化);
  • 开发中期:聚焦 “行为型模式”,解决对象间的协作问题(如用观察者模式实现模块联动,用策略模式封装多算法);
  • 维护阶段:侧重 “适配器模式”“装饰器模式”“外观模式”,在不修改原有代码的前提下扩展功能(如用适配器兼容旧接口,用外观模式简化复杂子系统调用);
  • 性能优化阶段:考虑 “享元模式”“代理模式”,减少内存占用或提升响应速度(如用享元模式复用相似对象,用代理模式实现缓存)。

二、跨模式组合实战:1+1>2 的设计技巧

实际项目中,单一模式往往无法满足复杂需求,需通过 “模式组合” 发挥更大价值。以下是 6 种高频跨模式组合案例,附代码思路与应用场景:

2.1 工厂模式 + 策略模式:动态创建策略

核心逻辑:用工厂模式封装 “策略对象的创建逻辑”,客户端只需指定策略类型,工厂自动创建对应策略,无需手动初始化策略对象,降低客户端与策略类的耦合。

应用场景:电商支付策略创建

# 1. 策略接口与具体策略(复用16章支付策略)

from chapter16 import PaymentStrategy, AlipayStrategy, WechatPayStrategy, UnionPayStrategy

# 2. 策略工厂:封装策略创建逻辑

class PaymentStrategyFactory:

@staticmethod

def create_strategy(strategy_type: str) -> PaymentStrategy:

"""根据策略类型创建对应支付策略"""

if strategy_type == "alipay":

return AlipayStrategy()

elif strategy_type == "wechat":

return WechatPayStrategy()

elif strategy_type == "unionpay":

return UnionPayStrategy()

else:

raise ValueError(f"不支持的支付方式:{strategy_type}")

# 3. 客户端使用:只需传递类型,无需关心策略创建细节

if __name__ == "__main__":

# 客户端选择支付方式(如从前端接收"wechat")

user_choice = "wechat"

# 工厂创建策略

strategy = PaymentStrategyFactory.create_strategy(user_choice)

# 上下文使用策略

from chapter16 import PaymentContext

context = PaymentContext(strategy)

# 处理支付

result = context.process_payment(

order_id="order_001",

user_id="user_123",

amount=99.90,

extra_params={"wechat_openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M"}

)

print("支付结果:", result)

优势:新增支付策略(如 ApplePay)时,只需新增策略类与工厂分支,客户端无需修改代码,符合开闭原则;客户端无需知道策略类的构造细节(如是否需要初始化参数)。

2.2 观察者模式 + 状态模式:状态变化联动通知

核心逻辑:状态模式管理对象的状态流转,观察者模式在状态变更时通知所有依赖对象,实现 “状态驱动行为 + 多对象联动” 的双重需求。

应用场景:订单状态变更通知

# 1. 观察者接口(复用14章观察者)

from chapter14 import Observer

# 2. 状态类(集成观察者通知逻辑)

from chapter15 import OrderState

class ObservableOrderState(OrderState):

def __init__(self):

super().__init__()

self.observers = [] # 维护观察者列表

def attach_observer(self, observer: Observer) -> None:

"""注册观察者"""

if observer not in self.observers:

self.observers.append(observer)

def notify_observers(self, data: dict) -> None:

"""状态变更时通知观察者"""

for observer in self.observers:

observer.update(self.context, data)

# 3. 具体状态:已支付状态(状态变更时通知)

class PaidState(ObservableOrderState):

def pay(self, amount: float, operator: str):

self._unsupported_action("支付")

def cancel(self, reason: str, operator: str):

# 取消订单逻辑...

print(f"已支付订单取消,原因:{reason}")

# 状态变更:已支付→已取消

from chapter15 import CancelledState

new_state = CancelledState()

# 传递观察者列表到新状态

new_state.observers = self.observers

self.context.set_state(new_state)

# 通知观察者

self.notify_observers({

"order_id": self.context.order_id,

"old_state": "已支付",

"new_state": "已取消",

"reason": reason,

"operator": operator

})

# 4. 客户端使用:订单取消时通知库存、UI、用户

if __name__ == "__main__":

# 创建观察者(库存模块、UI模块、用户通知模块)

class InventoryObserver(Observer):

def update(self, subject, data):

print(f"[库存观察者] 订单{data['order_id']}状态变更:{data['old_state']}→{data['new_state']},恢复库存")

class UIObserver(Observer):

def update(self, subject, data):

print(f"[UI观察者] 订单{data['order_id']}状态变更,刷新页面显示")

# 创建订单上下文与初始状态

from chapter15 import OrderContext, PendingPayState

order = OrderContext(PendingPayState())

# 切换到已支付状态

paid_state = PaidState()

# 注册观察者


paid_state.attach_observer(InventoryObserver("库存模块"))


paid_state.attach_observer(UIObserver("UI模块"))

order.set_state(paid_state)

# 取消订单(触发状态变更与通知)

order.cancel_order(reason="用户主动取消", operator="user_123")

优势:状态流转逻辑由状态模式封装,观察者模式负责通知联动,两者职责分离;新增需要联动的模块(如财务模块)时,只需新增观察者,无需修改状态类代码。

2.3 装饰器模式 + 命令模式:增强命令功能

核心逻辑:命令模式封装请求,装饰器模式为命令的execute()方法添加额外功能(如日志、权限校验),实现 “请求封装 + 动态功能增强”。

应用场景:带日志与权限的命令执行

# 1. 命令接口(复用11章命令)

from chapter11 import Command

# 2. 装饰器:日志装饰器

class LogCommandDecorator(Command):

def __init__(self, command: Command):

self.command = command

def execute(self) -> None:

# 执行前记录日志

import datetime

print(f"[{datetime.datetime.now()}] 开始执行命令:{
self.command.__class__.__name__}")

# 执行原命令

self.command.execute()

# 执行后记录日志

print(f"[{datetime.datetime.now()}] 命令执行完成")

# 3. 装饰器:权限装饰器

class AuthCommandDecorator(Command):

def __init__(self, command: Command, required_role: str):

self.command = command

self.required_role = required_role

def execute(self) -> None:

# 权限校验

current_role = "admin" # 模拟当前用户角色

if current_role != self.required_role:

raise PermissionError(f"权限不足,需{self.required_role}角色")

# 校验通过,执行原命令

self.command.execute()

# 4. 具体命令:关机命令

class ShutdownCommand(Command):

def execute(self) -> None:

print("执行关机命令:关闭系统服务、断开网络连接、关机")

# 5. 客户端使用:装饰命令并执行

if __name__ == "__main__":

# 创建原始命令

shutdown_cmd = ShutdownCommand()

# 装饰命令:先权限校验,再日志记录

decorated_cmd = LogCommandDecorator(

AuthCommandDecorator(shutdown_cmd, required_role="admin")

)

# 执行命令

decorated_cmd.execute()

优势:命令的核心功能(关机)与增强功能(日志、权限)分离,可灵活组合装饰器(如仅日志、仅权限、两者都有);新增增强功能(如异常捕获)时,只需新增装饰器,无需修改命令类。

2.4 外观模式 + 中介者模式:简化复杂子系统交互

核心逻辑:外观模式为客户端提供简化接口,中介者模式管理子系统间的交互,两者结合实现 “客户端简化调用 + 子系统解耦” 的双重目标。

应用场景:智能家居控制系统

# 1. 子系统类(灯光、空调、窗帘,复用9章智能家居)

from chapter9 import Light, AirConditioner, Curtain

# 2. 中介者:协调子系统交互

class SmartHomeMediator:

def __init__(self):

self.light = Light()

self.aircon = AirConditioner()

self.curtain = Curtain()

def trigger_sleep_mode(self) -> None:

"""睡眠模式:协调子系统交互"""

self.light.turn_on(brightness=10) # 灯光调暗

self.aircon.turn_on(temperature=27.0) # 空调调温

self.curtain.close() # 关闭窗帘

def trigger_wake_up_mode(self) -> None:

"""唤醒模式:协调子系统交互"""

self.curtain.open(percentage=50) # 窗帘半开

self.light.turn_on(brightness=30) # 灯光渐亮

self.aircon.turn_on(temperature=26.0) # 空调开机

# 3. 外观类:为客户端提供简化接口

class SmartHomeFacade:

def __init__(self):

self.mediator = SmartHomeMediator() # 持有中介者引用

def set_mode(self, mode: str) -> None:

"""简化接口:按模式调用中介者"""

if mode == "sleep":

self.mediator.trigger_sleep_mode()

print("睡眠模式已激活")

elif mode == "wake_up":

self.mediator.trigger_wake_up_mode()

print("唤醒模式已激活")

else:

print("不支持的模式")

# 4. 客户端使用:通过外观调用复杂子系统

if __name__ == "__main__":

facade = SmartHomeFacade()

# 激活睡眠模式(客户端只需调用一个方法)

facade.set_mode("sleep")

# 激活唤醒模式

facade.set_mode("wake_up")

优势:中介者解决子系统间的耦合问题(如睡眠模式需协调灯光、空调、窗帘),外观模式为客户端提供 “一句话调用” 的简化接口;子系统交互逻辑变更时,只需修改中介者,客户端与外观类无需调整。

2.5 责任链模式 + 工厂模式:动态构建责任链

核心逻辑:工厂模式封装 “责任链节点的创建与串联逻辑”,客户端只需指定链的类型,工厂自动创建节点并构建链条,无需手动串联节点。

应用场景:请求校验责任链

# 1. 责任链节点(复用10章责任链)

from chapter10 import Handler

class LogHandler(Handler):

def handle_request(self, request):

print(f"日志记录:请求{request['id']}")

if self.next_handler:

self.next_handler.handle_request(request)

class AuthHandler(Handler):

def handle_request(self, request):

if request.get("user_role") == "admin":

print(f"权限校验通过:用户{request['user_id']}")

if self</doubaocanvas>

相关推荐

电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
恢复大师app下载(恢复大师app下载软件)

是真的。开心手机恢复大师是一款苹果手机数据恢复软件,可以恢复删除的微信聊天记录、短信、通讯录、备忘录、qq聊天记录等17种数据。我测试了一下,确实是可以恢复的。而且开心手机恢复大师是可以免费试用的,是...

windowsxp下载网站(windows xp download)

目前无法下载因为红色警戒XP电脑版是一款已经停止开发的游戏,官方已经停止了对其的支持和更新。虽然网上有一些模拟器可以运行该游戏,但是安装和使用相对困难,而且可能存在版权问题。建议玩家选择其他同类型的游...

没人用过的激活码没过期(没人用过的激活码没过期可以用吗)

迷你世界并不存在什么激活码的。《迷你世界》是一款高度自由的休闲类3D沙盒游戏,有着非常方便快捷的多人联机模式,只要有网络就能和各个地方的小伙伴们一起玩。这里没有等级和规则限制,没有规定的玩法,只有随心...

2017年联想笔记本电脑有几款

17年的笔记本电脑可以勉强安装一下win10系统试试。关键看你的内存有多少,内存大于4个G的话可以安装win10速度不会太慢。最好是安装win7系统,这样能发挥你这台电脑的所有的性能,你用起来也会感觉...

当前显卡排名(当下显卡排行)

101、Irispro5802、Iris62002、Iris52004、UHD630/6205、HD6306、HD5307、HD46008、HD44009、HD420010、HD40...

win10专业版激活变成企业版(win10专业版激活变成企业版怎么办)

win10永久激活密钥很少,一旦网上有分享,等你拿到时就超过期限了,一般是要购买。激活win10系统可以使用激活工具:win10激活工具下载一、win10专业版产品密钥NXRQM-CXV6P-PBGV...

ghostwinxp下载纯净版(ghost win7纯净版下载)

可以下载的,现在官网和其他网站上都可以下载xp原版的。可以通过以下步骤下载我的世界游戏到xp系统中:1.首先打开你的浏览器软件,搜索关键字“我的世界xp版下载”,找到可靠下载地址;2.从下载页面下...

惠普完整版驱动(惠普最新驱动)

惠普官方的标准操作:HP1050安装驱动步骤:一:准备:拿出驱动光盘放入光驱或到HP官网下载完整版驱动。二:不要插USB数据线或插上线打印机电源不要开,安装完整版驱动,当程序提示插入USB数据线时,插...

浏览器最好用的(浏览器最好用的插件)

一、谷歌浏览器谷歌浏览器是公认最好用的,这个可以从市场占有率看出端倪,超过三分之二的用户使用谷歌浏览器。Chrome浏览器以简洁快速著称,不管是普通用户还是开发人员,chrome浏览器都是首选。Chr...

fast路由器6位初始密码(fast路由器的密码)

答:fast路由器初始密码是admin;新款的迅捷无线路由器,管理界面没有初始密码。查看迅捷无线路由器底部标签,标签上标注了admin,说明初始密码就是admin;如果没有,说明该路由器没有初始密码。...

硬盘恢复软件哪个好(硬盘 恢复软件)

迷你兔数据恢复工具:支持恢复硬盘丢失的数据Pc3000数据恢复软件是一款非常专业的硬盘修复工具,能够对电脑硬盘资料数据进行修复,通过使用这个软件可以解决硬盘数据丢失故障,是一个用户进行硬盘资料修复好帮...

十大品牌监控摄像头排名(十大品牌监控摄像头排名第一)

答:1、华为/HUAWEI9.92、小米/MI9.63、罗技/Logitech9.64、海康威视/HIKVISION9.25、乔安/Jooan9.26、普联/TP-LINK9.27、乐橙8.98、萤石...

360手机助手老旧版本大全(360手机助手 老版本)

在设置里面找到历史记录就可能查看360手机助手·换机神器是安卓系统的换机软件,因为苹果的换机软件是爱思。1、打开360手机卫士,登陆账号,点击账号。2、进入个人中心,点击账户安全,在密保工具中,点击解...

系统应用工程师(系统工程的应用)

信息软件系统工程师有前途,毕业以后可以从事软件开发,软件系统的维护,运营等等,和计算机有关的工作内容,因为计算机专业可以说是一个非常热门的专业,很多的大型企业公司基本上都是以计算机研发为主的,薪资福利...

取消回复欢迎 发表评论: