python设计模式 综合应用与实战指南
off999 2025-09-06 10:19 52 浏览 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>
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
windows7旗舰版多少钱(win7旗舰版要多少钱)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
