当前位置: 首页 > 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.lryc.cn/news/573241.html

相关文章:

  • 分组交换比报文交换的传输时延更低
  • PHP语法基础篇(五):流程控制
  • Occt几何内核快速入门
  • 力扣网C语言编程题:多数元素
  • OPENPPP2传输层控制算法剖析及漏洞修复对抗建议
  • 5.3 VSCode使用FFmpeg库
  • Git 使用手册:从入门到精通
  • 基于Qt的UDP主从服务器设计与实现
  • 【Linux第四章】gcc、makefile、git、GDB
  • 从需求到落地:充电桩APP开发的定制化流程与核心优势
  • 免费1000套编程教学视频资料视频(涉及Java、python、C C++、R语言、PHP C# HTML GO)
  • Python subprocess 模块详解
  • 60-Oracle 10046事件-实操
  • Java面试复习指南:JVM原理、并发编程与Spring框架
  • 微服务架构的适用
  • Zephyr 电源管理机制深度解析:从 Tickless Idle 到平台 Suspend 实践
  • 【设计模式】6.原型模式
  • 道德的阶梯:大语言模型在复杂道德困境中的价值权衡
  • 经典控制理论:线性化笔记
  • 开源无广告GIF 制作软件三模录制,教程 / 游戏 GIF 一键生成支持鼠标轨迹显示
  • Linux运维新人自用笔记(Ubuntu磁盘命名规则、新磁盘分区、主流文件系统类型、mkfs命令格式化文件系统、临时和永久挂载、挂载报错、dd指令)
  • [muduo] TcpConnection | 回调交互
  • Go语言网络编程:使用 net/http 构建 RESTful API
  • React JSX语法
  • 分布式锁的四种实现方式:从原理到实践
  • 【Linux仓库】进程概念与基本操作【进程·贰】
  • 使用 Telegraf 向 TDengine 写入数据
  • HarmonyOS 5的分布式通信矩阵是如何工作的?
  • Flink流水线+Gravitino+Paimon集成
  • 5.2 Qt Creator 使用FFmpeg库