🎯 什麼情境該想到我

當你「需要在『客戶端』和『真正的物件』之間插一個替身,用來控制對它的存取」的時候:可能是這個物件很貴要延後才建(虛擬代理)、要先檢查權限(保護代理)、它其實在遠端(遠端代理),或想順便做快取/引用計數(智慧代理)。

⚙️ 怎麼用(步驟 / 公式)

意圖:為另一個物件提供一個替身或佔位符,以控制對這個物件的存取。

主要參與者 / 結構:

  • Subject(主題介面):RealSubject 與 Proxy 共同的介面,讓兩者對客戶端可互換。
  • RealSubject(真實主題):代理所代表、真正做事的物件。
  • Proxy(代理):實作 Subject 介面,持有 RealSubject 的參照;在把呼叫轉發給它之前/之後插入控制邏輯(建立、權限檢查、快取、計數、遠端通訊等)。
  • Client:只認得 Subject 介面,實際拿到的是 Proxy。

常見種類:虛擬代理(延遲建立昂貴物件)、保護代理(存取控制/權限)、遠端代理(代表遠端物件、封裝網路通訊)、智慧代理(引用計數、快取、鎖定等附加管理)。

做法要點:

  1. 讓 Proxy 與 RealSubject 實作同一 Subject 介面。
  2. Proxy 內部持有(或在需要時才建立)RealSubject。
  3. 在轉呼叫的前後加入所需的控制邏輯。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 多一層間接一定會增加回應時間與複雜度。
  • 若沒有「控制存取」的需求,只是單純想加功能,那該用裝飾者而不是代理。
  • 延遲載入等行為若隱藏得太深,可能造成難以預期的效能或時序問題。

🔗 相關工具