漫谈设计模式 [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的职责是处理请求,而不是记录日志。通过代理模式,你可以将日志记录和权限检查等职责分离出来,保持代码的清晰和可维护性。

优势与适用场景

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

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

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

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

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

常见误区与优化建议

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

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

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

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

总结与延伸阅读

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

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

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

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

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

相关推荐
神奇夜光杯5 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜17 分钟前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼20 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~24 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
放飞自我的Coder1 小时前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词
正义的彬彬侠1 小时前
【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价
python·机器学习·sklearn
张小生1802 小时前
PyCharm中 argparse 库 的使用方法
python·pycharm
秃头佛爷2 小时前
Python使用PDF相关组件案例详解
python
Dxy12393102162 小时前
python下载pdf
数据库·python·pdf
叶知安2 小时前
如何用pycharm连接sagemath?
ide·python·pycharm