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

【设计模式】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. 保持了原始设计中的所有核心关系和方法调用流程

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

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

相关文章:

  • 鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(1/3)
  • 黑马头条-数据管理平台
  • 在Linux中,Iptables能做什么?
  • 神经网络中的交叉熵(Cross-Entropy)损失函数详解
  • Spring MVC异常处理机制
  • 借助ChatGPT快速开发图片转PDF的Python工具
  • ubuntu24.4 + ros2 jazzy 安装gazebo
  • 算法-Day04
  • Selenium学习
  • 2016. 增量元素之间的最大差值
  • 力扣刷题(第六十四天)
  • 解决mysql左连接加where就不会保留左表中的全部数据的问题
  • 【转】如何画好架构图:架构思维的三大底层逻辑
  • 冰箱压缩机电机驱动板【IPM部分】
  • ffmpeg(六):图片与视频互转命令
  • 抖音的视频怎么下载下来——下载狗解析工具
  • QC -io 服务器排查报错方式/报错: Failed to convert string to integer of varId variable!“
  • Nginx反向代理解决跨域问题详解
  • 进程间通信、线程间通信
  • 基于Qt的UDP主从服务器设计与实现
  • 网站建设充值入口/指数运算法则
  • 关于门户网站建设的请示/今天重大新闻事件
  • 下载jsp网站开发用啥工具/湖南手机版建站系统开发
  • 建设网站需要下载神呢软件吗/西安百度推广公司
  • 模仿淘宝详情页做网站/哪些网站推广不收费
  • 赣州做网站多少钱/百度推广按效果付费是多少钱