Python 代理模式讲解和代码示例

简介: Python 代理模式讲解和代码示例

使用示例尽管代理模式在绝大多数 Python 程序中并不常见 但它在一些特殊情况下仍然非常方便 当你希望在无需修改客户代码的前提下于已有类的对象上增加额外行为时 该模式是无可替代的

识别方法代理模式会将所有实际工作委派给一些其他对象 除非代理是某个服务的子类 否则每个代理方法最后都应该引用一个服务对象

概念示例

本例说明了代理设计模式的结构并重点回答了下面的问题

  • 它由哪些类组成
  • 这些类扮演了哪些角色
  • 模式中的各个元素会以何种方式相互关联

main.py: 概念示例

from abc import ABC, abstractmethodclass Subject(ABC):    """    The Subject interface declares common operations for both RealSubject and    the Proxy. As long as the client works with RealSubject using this    interface, you'll be able to pass it a proxy instead of a real subject.    """
    @abstractmethod
    def request(self) -> None:        passclass RealSubject(Subject):    """    The RealSubject contains some core business logic. Usually, RealSubjects are    capable of doing some useful work which may also be very slow or sensitive -    e.g. correcting input data. A Proxy can solve these issues without any    changes to the RealSubject's code.    """
    def request(self) -> None:        print("RealSubject: Handling request.")class Proxy(Subject):    """    The Proxy has an interface identical to the RealSubject.    """
    def __init__(self, real_subject: RealSubject) -> None:        self._real_subject = real_subject
    def request(self) -> None:        """        The most common applications of the Proxy pattern are lazy loading,        caching, controlling the access, logging, etc. A Proxy can perform one        of these things and then, depending on the result, pass the execution to        the same method in a linked RealSubject object.        """
        if self.check_access():            self._real_subject.request()            self.log_access()    def check_access(self) -> bool:        print("Proxy: Checking access prior to firing a real request.")        return True
    def log_access(self) -> None:        print("Proxy: Logging the time of request.", end="")def client_code(subject: Subject) -> None:    """    The client code is supposed to work with all objects (both subjects and    proxies) via the Subject interface in order to support both real subjects    and proxies. In real life, however, clients mostly work with their real    subjects directly. In this case, to implement the pattern more easily, you    can extend your proxy from the real subject's class.    """
    # ...
    subject.request()    # ...if __name__ == "__main__":    print("Client: Executing the client code with a real subject:")    real_subject = RealSubject()    client_code(real_subject)    print("")    print("Client: Executing the same client code with a proxy:")    proxy = Proxy(real_subject)    client_code(proxy)

Output.txt: 执行结果

Client: Executing the client code with a real subject:
RealSubject: Handling request.
Client: Executing the same client code with a proxy:
Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.
相关文章
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
181 26
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
314 1
|
2月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
168 1
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
233 100
|
1月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
356 95
|
2月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
231 104
|
2月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
428 99
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
152 88
|
2月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
262 102
|
1月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。

推荐镜像

更多
下一篇
oss云网关配置