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.