漫谈设计模式 [11]:代理模式

引导性开场

菜鸟:老鸟,我最近在做一个项目,发现有些模块的访问控制非常复杂,有时候还需要添加一些额外的功能,比如日志记录和权限检查。我觉得代码变得很难维护,不知道该怎么简化这些操作。你有什么建议吗?

老鸟:听起来你遇到了一个常见的问题。你有没有听说过代理模式?

菜鸟:代理模式?没听过,能详细说说吗?

老鸟:当然可以。代理模式是一种设计模式,它能帮助你在不改变原有代码的前提下,添加额外的功能。让我们一步步来看。

渐进式介绍概念

老鸟:想象一下,你有一个朋友非常忙,你需要通过他的秘书与他联系。这个秘书就是你的代理,他可以帮你处理一些简单的事情,比如预约时间、传递信息等。这样,你的朋友就可以专注于他的重要工作。这就是代理模式的基本思想:通过代理对象来控制对实际对象的访问。

菜鸟:哦,我明白了。代理对象就像是中间人,帮我们处理一些额外的事务。

老鸟:没错。代理模式的核心思想就是在不改变原有对象的情况下,通过代理对象来添加额外的功能。

Python代码示例,逐步展开

老鸟 :我们用Python来实现一个简单的例子。假设我们有一个RealSubject类,它有一个request方法。

python 复制代码
class RealSubject:
    def request(self):
        print("RealSubject: Handling request.")

老鸟 :这是一个基础的实现。现在,我们创建一个代理类Proxy,它也有一个request方法,但内部会调用RealSubjectrequest方法。

python 复制代码
class Proxy:
    def __init__(self, real_subject):
        self._real_subject = real_subject

    def request(self):
        print("Proxy: Logging before calling real request.")
        self._real_subject.request()
        print("Proxy: Logging after calling real request.")

菜鸟:这样,代理对象在调用实际对象的方法之前和之后可以添加一些操作,比如日志记录。

老鸟 :对了。你可以试试创建RealSubjectProxy对象,并调用request方法。

python 复制代码
if __name__ == "__main__":
    real_subject = RealSubject()
    proxy = Proxy(real_subject)
    proxy.request()

菜鸟:运行结果如下:

复制代码
Proxy: Logging before calling real request.
RealSubject: Handling request.
Proxy: Logging after calling real request.

老鸟:不错吧?这就是代理模式的基本实现。

问题与反思

菜鸟 :我明白了代理模式的基本概念,但我有个疑问,为什么不直接在RealSubject类中添加日志记录呢?

老鸟 :这是个好问题。如果你直接在RealSubject类中添加日志记录,那就违背了单一职责原则。RealSubject的职责是处理请求,而不是记录日志。通过代理模式,你可以将日志记录和权限检查等职责分离出来,保持代码的清晰和可维护性。

优势与适用场景

老鸟:代理模式有很多优势,比如:

  • 控制访问:代理可以控制对实际对象的访问,比如添加权限检查。
  • 延迟初始化:代理可以延迟实际对象的创建和初始化,节省资源。
  • 日志记录和监控:代理可以在调用实际对象的方法之前和之后添加日志记录和监控功能。

菜鸟:听起来很实用。有哪些常见的适用场景呢?

老鸟:一些常见的场景包括:

  • 远程代理:为远程对象提供局部代表。
  • 虚拟代理:根据需要创建开销较大的对象。
  • 保护代理:控制对原始对象的访问。

常见误区与优化建议

菜鸟:那使用代理模式有没有什么常见的误区呢?

老鸟:当然有。一些开发者可能会滥用代理模式,导致代码变得复杂且难以维护。还有,代理模式可能会引入性能开销,因为每次调用都需要通过代理。

菜鸟:那有什么优化建议吗?

老鸟:一个好的建议是,只有在确实需要控制访问、延迟初始化或添加额外功能时,才使用代理模式。要确保代理的实现尽量简单,不要引入不必要的复杂性。

总结与延伸阅读

老鸟:今天我们讨论了代理模式的核心思想、实现方法、优势以及适用场景。希望你能在实际项目中灵活应用。如果你对设计模式感兴趣,我推荐你读读《设计模式:可复用面向对象软件的基础》这本书,它详细介绍了各种设计模式。

菜鸟:谢谢老鸟,我学到了很多。我对其他设计模式也很感兴趣,有什么建议吗?

老鸟:当然可以。你可以从单例模式和观察者模式开始,它们也是非常常用的设计模式。

菜鸟:好的,我会去学习的。谢谢老鸟!

老鸟:不客气,有什么问题随时找我。

相关推荐
运维开发王义杰几秒前
Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
开发语言·python
小吕学编程5 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式
DanCheng-studio27 分钟前
毕设 基于机器视觉的驾驶疲劳检测系统(源码+论文)
python·毕业设计·毕设
carpell29 分钟前
【语义分割专栏】3:Segnet实战篇(附上完整可运行的代码pytorch)
人工智能·python·深度学习·计算机视觉·语义分割
pan_junbiao43 分钟前
Spring框架的设计模式
java·spring·设计模式
一只小波波呀1 小时前
打卡第48天
python
zstar-_1 小时前
一套个人知识储备库构建方案
python
Amo Xiang2 小时前
《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
python·选择题·基础语法
江梦寻2 小时前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
霖檬ing2 小时前
Python——MySQL远程控制
开发语言·python·mysql