【设计模式】代理模式

前言

1. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局的访问点。

2. 工厂模式(Factory Pattern):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。

3. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新。

4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不会影响到其他对象。

5. 策略模式(Strategy Pattern):定义一系列的算法,将每个算法封装起来,并使它们可以相互替换。

6. 命令模式(Command Pattern):将请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化。

7. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。

8. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的接口,从而使得子系统更加容易使用。

9. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为。

10. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。

11.代理模式(代理模式):是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理通常充当客户端和真实对象之间的中介,用于控制对真实对象的访问或添加一些额外的行为。

这些是Python中常用的设计模式,通过使用这些设计模式可以提高代码的可读性、可维护性和重用性。

代理模式

# 主题接口
class Subject:
    def request(self):
        pass

# 真实主题
class RealSubject(Subject):
    def request(self):
        print("RealSubject: Handling request")

# 代理类
class Proxy(Subject):
    def __init__(self, real_subject):
        self.real_subject = real_subject

    def request(self):
        # 在访问真实主题之前可以执行一些额外的操作
        print("Proxy: Logging request")

        # 调用真实主题的方法
        self.real_subject.request()

        # 在访问真实主题之后可以执行一些额外的操作
        print("Proxy: Post-processing request")

# 客户端代码
if __name__ == "__main__":
    # 创建真实主题
    real_subject = RealSubject()

    # 创建代理并传入真实主题
    proxy = Proxy(real_subject)

    # 客户端通过代理访问真实主题
    proxy.request()

 Subject是主题接口,定义了真实主题和代理共同的接口。RealSubject是真实主题,实现了主题接口的具体操作。Proxy是代理类,它包含一个真实主题的实例,并在访问真实主题前后执行一些额外的操作。

优点:

  1. 控制对对象的访问: 代理模式允许在访问真实对象之前或之后执行一些额外的操作,从而对对象的访问进行控制。这包括权限控制、验证等。

  2. 实现懒加载: 虚拟代理可以实现懒加载,即只有在需要时才创建和加载真实对象,从而提高性能。

  3. 实现远程代理: 代理模式可以用于在不同地址空间中代理对象,实现远程代理。

  4. 实现缓存代理: 代理模式可以用于缓存对象的状态,以减少资源的消耗,提高性能。

缺点:

  1. 复杂性增加: 引入代理会增加系统的复杂性,因为需要创建额外的类和接口,并且在设计中需要考虑更多的层次关系。

  2. 性能损耗: 在某些情况下,代理模式可能引入一些性能损耗,特别是在频繁访问真实对象的情况下。

  3. 可能引入单点故障: 如果代理对象负责管理真实对象的生命周期,那么代理对象可能成为单点故障的潜在源。

应用场景

  1. 远程代理: 用于在不同地址空间中代理对象。
  2. 虚拟代理: 用于按需创建开销较大的对象,或延迟对象的创建。
  3. 保护代理: 用于控制对对象的访问权限。
  4. 缓存代理: 用于缓存对象的状态,以提高性能。

你可能感兴趣的:(python,设计模式,代理模式)