当前位置: 首页 > backend >正文

【设计模式】4.代理模式

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

代理模式

20250518094605

1. 第一版

class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = valueclass Pursuit:def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name}送你洋娃娃")def give_flowers(self):print(f"{self.mm.name}送你鲜花")def give_chocolate(self):print(f"{self.mm.name}送你巧克力")# 客户端调用代码
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李娇娇"zhuojiayi = Pursuit(jiaojiao)zhuojiayi.give_dolls()zhuojiayi.give_flowers()zhuojiayi.give_chocolate()input()  # 相当于C#的Console.Read()

这一版本没有代理,增加代理

2. 第二版

20250518094740

class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = valueclass Proxy:def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name} 送你洋娃娃")def give_flowers(self):print(f"{self.mm.name} 送你鲜花")def give_chocolate(self):print(f"{self.mm.name} 送你巧克力")# 客户端调用代码
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李娇娇"daili = Proxy(jiaojiao)daili.give_dolls()daili.give_flowers()daili.give_chocolate()input()  # 等待用户输入,相当于C#的Console.Read()

3. 第三版

20250518095309

以下是完整的 Python 实现,包含接口抽象、追求者类、代理类和客户端代码,严格遵循代理模式的设计:

from abc import ABC, abstractmethod# 代理接口 (Python 中使用抽象基类实现接口)
class GiveGift(ABC):@abstractmethoddef give_dolls(self):pass@abstractmethoddef give_flowers(self):pass@abstractmethoddef give_chocolate(self):pass# SchoolGirl 类
class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = value# 追求者类 (实现 GiveGift 接口)
class Pursuit(GiveGift):def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name} 送你洋娃娃")def give_flowers(self):print(f"{self.mm.name} 送你鲜花")def give_chocolate(self):print(f"{self.mm.name} 送你巧克力")# 代理类 (同样实现 GiveGift 接口)
class Proxy(GiveGift):def __init__(self, mm):self.gg = Pursuit(mm)  # 内部持有追求者实例def give_dolls(self):self.gg.give_dolls()  # 调用追求者的方法def give_flowers(self):self.gg.give_flowers()def give_chocolate(self):self.gg.give_chocolate()# 客户端代码
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李娇娇"# 使用代理而不是直接使用追求者daili = Proxy(jiaojiao)daili.give_dolls()daili.give_flowers()daili.give_chocolate()input()  # 等待用户输入

关键设计说明:

  1. 使用 abc 模块实现了 GiveGift 接口(Python 没有原生接口,用抽象基类模拟)
  2. PursuitProxy 都继承自 GiveGift,保证接口一致性
  3. Proxy 内部持有 Pursuit 实例,所有方法调用都委托给实际追求者
  4. 客户端只与代理交互,不知道实际追求者的存在
  5. 保持了原始设计中的所有核心关系和方法调用流程

这个实现完整展示了代理模式的几个关键特点:

  • 为其他对象提供一种代理以控制对这个对象的访问
  • 代理类和真实类实现相同接口
  • 代理类内部持有真实类的实例
  • 客户端通过代理间接访问真实对象
http://www.xdnf.cn/news/14634.html

相关文章:

  • 基于YOLO的智能车辆检测与记录系统
  • `customRef` 在实战中的使用:防抖、计算属性缓存和异步数据获取
  • 【StarRocks系列】建表优化
  • SpringBoot电脑商城项目--显示勾选+确认订单页收货地址
  • ZooKeeper 3.9.2 集群安装指南
  • Jupyter notebook调试:设置断点运行
  • Kubernetes 集群性能优化实战:从资源分配到调度策略
  • `teleport` 传送 API 的使用:在 Vue 3 中的最佳实践
  • 为WIN10微软输入法的全角切换Bug禁用Shift+Space组合键
  • C++ unordered_set基础概念、对象创建、赋值操作、数据插入、数据删除、代码练习 1 2
  • 前端开发面试题总结-vue3框架篇(二)
  • 《map和set的使用介绍》
  • stm32串口(uart)2转发到串口(uart)3实现
  • Qt实战:自定义二级选项框 | 附完整源码
  • 为车辆提供路径规划解决方案:技术演进、挑战与未来蓝图
  • 网络编程及原理(六):三次握手、四次挥手
  • 【软考高级系统架构论文】论NoSQL数据库技术及其应用
  • 通过事件过滤器拦截QRadioButton点击事件
  • 算法第38天|322.零钱兑换\139. 单词拆分
  • 数据分析和可视化:Py爬虫-XPath解析章节要点总结
  • 【Python进阶系列】第9篇:聊聊 Python 中常用的第三方库
  • C++递归应用
  • 7.3.1二叉排序树
  • 【编译原理】语句的翻译
  • FPGA基础 -- Verilog 共享任务(task)和函数(function)
  • VUE3 Element UI el-button type icon
  • King’s LIMS 系统引领汽车检测实验室数字化转型
  • QT历史版本,5.15.2使用清华源半小时安装速成
  • GitHub Actions + SSH 自动部署教程
  • 日常运维问题汇总-24