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

优势与适用场景

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

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

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

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

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

常见误区与优化建议

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

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

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

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

总结与延伸阅读

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

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

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

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

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

相关推荐
亿牛云爬虫专家25 分钟前
如何通过subprocess在数据采集中执行外部命令 —以微博为例
爬虫·python·数据采集·多线程·代理ip·subprocess·微博
敲代码不忘补水42 分钟前
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
开发语言·python·json
西农小陈2 小时前
python-字符排列问题
数据结构·python·算法
测试19982 小时前
使用Selenium进行网页自动化
自动化测试·软件测试·python·selenium·测试工具·自动化·测试用例
小黄酥2 小时前
Python学习笔记--模块
笔记·python·学习
UvwxyZ6662 小时前
python日志记录与命令行交互
开发语言·python
TechQuester2 小时前
OpenAI 刚刚推出 o1 大模型!!突破LLM极限
人工智能·python·gpt·算法·chatgpt
西农小陈3 小时前
python-简单的数据结构
数据结构·python·算法
无敌开心3 小时前
Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警
爬虫·python·django
api773 小时前
1688商品详情API返回值中的售后保障与服务信息
java·服务器·前端·javascript·python·spring·pygame