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

相关文章:

  • 如何优化HarmonyOS 5的分布式通信性能?
  • 专业APP定制开发方案详解
  • 【网络产品经营】园区网络
  • Qt Library库系列----Serial串口
  • vue3+arcgisAPI4案例:智慧林业资源监测分析平台(附源码下载)
  • 闲庭信步使用SV进行图像处理系列教程介绍
  • Qt、C++自定义按钮、组件、事件编程开发练习,万字实战解析!!
  • Django中为api自定义一些装饰器:如参数校验等
  • GIFPlayer 使用指南:创建可调速的 GIF 播放器
  • 59-Oracle 10046事件-知识准备
  • Java面试复习指南:JVM原理、并发编程与Spring框架
  • Python UDP Socket 实时在线刷卡扫码POS消费机服务端示例源码
  • 「Linux文件及目录管理」通配符与文件名
  • 使用 Isaac Sim 模拟机器人
  • 蓝牙 5.0 新特性全解析:传输距离与速度提升的底层逻辑(面试宝典版)
  • day37
  • Redis数据结构之GEO
  • ROS1/ROS2中工作空间和工作包创建详解
  • WIFI原因造成ESP8266不断重启的解决办法
  • 创业知识概论
  • 大数据Hadoop集群搭建
  • 第五章 中央处理器
  • tkinter 的 pack() 布局管理器学习指南
  • 《汇编语言:基于X86处理器》第3章 汇编语言基础
  • 一个库,比如kott_tinymce ,想把的依赖库从kotti升级到kotti2 ,请问我是不是查找替换,把所有的kotti字符替换成kotti2就行了?
  • 加密货币:比特币
  • 如何进行IEC61850的一致性测试
  • linux——C程序的编译与调试
  • AR 眼镜之-条形码识别-实现方案
  • 7.3.1二叉排序树