📜  代理方法Python设计模式

📅  最后修改于: 2022-05-13 01:55:39.190000             🧑  作者: Mango

代理方法Python设计模式

代理方法是结构设计模式,允许您为另一个对象提供替换。在这里,我们使用不同的类来表示另一个类的功能。最重要的部分是在这里我们创建了一个具有原始对象功能的对象以提供给外部世界。
Proxy一词的意思是“代替”或“代表”,直接解释了代理方法

代理也称为代理、句柄和包装器。它们在结构上与适配器装饰器密切相关,但不是目的。

代理设计方法代理设计模式python

代理设计方法

一个真实的例子可以是支票或信用卡,它代表我们银行账户中的内容。它可以用来代替现金,并在需要时提供一种获取现金的方法。这正是代理模式所做的——“控制和管理对他们保护的对象的访问”。

不使用代理方法的问题

让我们通过考虑处理所有学生记录的学院数据库的例子来理解这个问题。例如,我们需要从数据库中找到余额费用大于 500 的学生的姓名。因此,如果我们遍历整个学生列表,并且对于每个学生对象,如果我们与数据库建立单独的连接,那么它将是被证明是一项昂贵的任务。

代理方法问题

代理方法问题

使用代理方法的解决方案

这是解决上述问题的代理方法。我们将创建一个代理服务器或者可能是一个到数据库的代理连接,之后,我们不必为每个学生对象创建到数据库的单独连接。
我们将简单地使用代理获取我们需要的数据,而不会浪费大量内存来创建对象。

代理方法解决方案

代理方法解决方案

class College:
    '''Resource-intensive object'''
  
    def studyingInCollege(self):
        print("Studying In College....")
  
  
class CollegeProxy:
    '''Relatively less resource-intensive proxy acting as middleman.
     Instantiates a College object only if there is no fee due.'''
  
    def __init__(self):
  
        self.feeBalance = 1000
        self.college = None
  
    def studyingInCollege(self):
  
        print("Proxy in action. Checking to see if the balance of student is clear or not...")
        if self.feeBalance <= 500:
            # If the balance is less than 500, let him study.
            self.college = College()
            self.college.studyingInCollege()
        else:
  
            # Otherwise, don't instantiate the college object.
            print("Your fee balance is greater than 500, first pay the fee")
  
"""main method"""
  
if __name__ == "__main__":
      
    # Instantiate the Proxy
    collegeProxy = CollegeProxy()
      
    # Client attempting to study in the college at the default balance of 1000.
    # Logically, since he / she cannot study with such balance,
    # there is no need to make the college object.
    collegeProxy.studyingInCollege()
  
    # Altering the balance of the student
    collegeProxy.feeBalance = 100
      
    # Client attempting to study in college at the balance of 100. Should succeed.
    collegeProxy.studyingInCollege()

输出:

Proxy in action. Checking to see if the balance of student is clear or not...
Your fee balance is greater than 500, first pay the fee

Proxy in action. Checking to see if the balance of student is clear or not...
Studying In College....

类图

下面是代理方法的类图:

代理方法类图

代理方法类图

好处

  • 开放/封闭原则:在不改变客户端代码的情况下,我们可以很容易地在我们的应用程序中引入新的代理。
  • 平滑服务:即使服务对象未准备好或在当前场景中不可用,我们创建的代理也能正常工作。
  • 安全性:代理方法也为系统提供了安全性。
  • 性能:它通过避免可能是巨大的尺寸和内存密集型的对象的重复来提高应用程序的性能。

缺点

  • 响应缓慢:服务可能会变慢或延迟。
  • 抽象层:此模式引入了另一层抽象,如果某些客户端直接访问 RealSubject 代码并且其中一些可能访问代理类,则有时可能会出现问题
  • 复杂性增加:由于引入了许多新类,我们的代码可能会变得非常复杂。

适用性

  • 虚拟代理:最重要的是在数据库中使用,例如数据库中存在某些资源消耗量大的数据,我们经常需要它。所以。在这里,我们可以使用代理模式来创建多个代理并指向对象。
  • Protective Proxy:在应用程序上创建一个保护层,可用于学校或学院只有少数没有的场景。的网站可以使用 WiFi 打开。
  • 远程代理:当服务对象位于远程服务器上时特别使用。在这种情况下,代理通过处理所有细节的网络传递客户端请求。
  • 智能代理:它用于通过在访问对象时干预特定操作来为应用程序提供额外的安全性。

进一步阅读Java中的代理设计方法