Python 中的对象通信代理设计模式


类和对象是编程的基本元素。这些实体构建了整个逻辑并控制对代码不同部分的访问。可能会出现我们受到操作复杂性限制的情况,因此,我们需要一个高效且优化的解决方案。

代理设计模式就是这样一种强大的技术,它可以创建代理类而不是真实类的实例。在本文中,我们将探讨这种技术的要点,并了解如何使用它来解决涉及大量数据的问题。让我们开始讨论。

理解代理设计模式

在代理设计模式中,我们创建一个充当真实类接口的代理类。现在,问题是我们为什么要创建接口?好吧,当我们处理涉及大量内存时间的问题时,重复使用类的对象和数据而不是重复创建新的引用是合乎逻辑的。

  • 在创建类之后,我们使用对象/实例来访问类数据,但是如果类操作很复杂,则应适当地规范对象实例化。

  • 这就是代理设计模式发挥作用的地方。为包含大量数据的真实类初始化新对象是一种代价高昂的方法。相反,我们可以创建一个类似于真实类的代理类,并且可以根据操作需要进行自定义。

考虑一种情况,我们需要计算检索数百万名政府雇员的信息。如果客户端尝试通过为每个调用创建实例来直接访问真实类,那么这将使整个过程变得非常昂贵。明智的做法是使用一个媒介或接口,该媒介或接口具有真实类所有属性,并且可以通过代理类进行控制。

使用代理设计模式进行对象通信

对象通信是指在同一模式内不同代理对象之间的数据传输。我们只会创建一个真实的类实例,其余的操作将依赖于不同的代理对象及其相互交互。

我们将创建一个抽象类,它将作为创建真实类和代理类的模板。此抽象类将由这些具体类实现。我们的任务是检索与 200 万名政府雇员的薪资相关的信息。我们将创建两个抽象方法来计算薪资并显示雇员详细信息。

这两个方法都将在具体/真实类中定义。

  • 在具体类中,将计算和处理 200 万名雇员的薪资。此操作的计算需求非常昂贵,因此我们将创建一个代理类

  • 在代理类中,我们将再次实现抽象类的方法,并添加额外的自定义层。我们自定义程序以检查类属性“real_OBJ”是否存在。

第一次执行程序时,将创建一个真实类对象,此后每次执行都将使用缓存对象。缓存对象为数据可重用性提供了一个更快的平台。通过这种方式,我们将使用单个真实对象并借助不同的代理对象对其进行控制。

示例

以下是实现对象通信代理设计模式的示例。

import abc
class Abstract_Base_class(metaclass=abc.ABCMeta):
   @abc.abstractmethod
   def Sal_calculator(self, rate):
      pass
   @abc.abstractmethod
   def employee_details(self):
      pass
class concrete(Abstract_Base_class):
   def __init__(self):
      self.total_employees = []
      for x in range(2000000):
         self.total_employees.append(x)
   def employee_details(self):
      self.employeeSector = "Government"
      return len(self.total_employees), self.employeeSector
   def Sal_calculator(self, rate):
      self.total_sal = 150000 * rate * len(self.total_employees)
      return self.total_sal
class proxy(Abstract_Base_class):
   def __init__(self):
      if not getattr(self.__class__, "real_OBJ", None):
         self.__class__.real_OBJ = concrete()
         print("A real object is created")
      else:
         print("Object already exists, using cached object")
   def Sal_calculator(self, rate):
      return self.__class__.real_OBJ.Sal_calculator(rate)
   def employee_details(self):
      return self.__class__.real_OBJ.employee_details()
if __name__ == "__main__":
   first_Prox = proxy()
   print(f"The total Salary budget with a 12% rate is: {first_Prox.Sal_calculator(12)}")
   print(f"The total Salary budget with a 10% rate is: {first_Prox.Sal_calculator(10)}")
   print(f"The total Salary budget with a 15% rate is: {first_Prox.Sal_calculator(15)}")
   Second_Prox = proxy()
   print(f"The total number of employees and their sectors are: {Second_Prox.employee_details()}")
   Third_Prox = proxy()
   print("This is a 3rd proxy object")

输出

A real object is created
The total Salary budget with a 12% rate is: 3600000000000
The total Salary budget with a 10% rate is: 3000000000000
The total Salary budget with a 15% rate is: 4500000000000
Object already exists, using cached object
The total number of employees and their sectors are: (2000000, 'Government')
Object already exists, using cached object
This is a 3rd proxy object

结论

在本文中,我们介绍了对象通信代理设计模式的基础知识。我们了解了内存时间在计算操作中的重要性。我们使用代理对象来生成优化的程序。借助这些对象,可以避免昂贵的对象调用。最后,我们讨论了计算 200 万名员工数据的现实问题,并使用代理对象来处理此复杂操作。

更新于:2024年1月19日

85 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.