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 萬名員工資料的現實問題,並使用代理物件來處理此複雜操作。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP