当前位置: 首页 > 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. 保持了原始设计中的所有核心关系和方法调用流程

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

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

相关文章:

  • 鸿蒙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主从服务器设计与实现
  • 集群聊天项目服务器----JSON库
  • C语言:排序算法
  • 作为测试人员,平时用什么大模型?怎么用?
  • PHP语法基础篇(五):流程控制
  • 如何匹配晶振的负载电容
  • 【SystemVerilog 2023 Std】第6章 数据类型 Data types (1)
  • C# 网络编程-关于请求头(Request Headers)和 响应头(Response Headers)作用(五)
  • SiteAzure:解决数据库服务器内存频繁吃满
  • 【Linux 平台总线驱动开发实战】
  • 三种语言写 MCP