分類
結構型模式。
這個模式在解決什麼
代理模式的想法是:不要讓外部直接碰真實物件,而是先透過一個代理物件進行存取控制。
這個代理可以幫忙處理額外責任,例如:
- 延遲建立昂貴物件
- 轉送遠端呼叫
- 權限檢查
- 快取、記錄、保護或節流
核心做法
代理和真實物件通常會實作同一套介面。外部只知道自己正在呼叫某個服務,但實際上先進到代理,再由代理決定要不要、或何時把請求轉交給真實物件。
因此,代理模式的關鍵不在改變功能,而是在既有功能前後加上一層控制。
什麼時候適合用
下面兩種情境很常見:
- 遠端代理:真實物件其實在另一台機器或另一個程序中,代理負責包裝網路通訊細節
- 虛擬代理:真實物件建立成本很高,代理先頂上,等真的被使用時才建立它
例子
遠端代理的例子是客戶端透過某個本地端物件去呼叫伺服器服務。呼叫端看起來像在用本地介面,但其實代理已經在背後處理序列化、封包和傳輸。
虛擬代理的例子則是大型圖片、音訊或其他很重的資源。畫面先拿到代理物件,等到真的需要顯示或播放時,代理才把真實資源載進來,之後再把操作委派給它。
類圖

這一篇先記住的重點
- 代理模式是在真實物件前面加一層可控入口
- 它的目的通常是控制存取,而不是擴充功能
- 遠端代理和虛擬代理是最容易遇到的兩種形式
參考書目
《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates