代理 (Proxy)

★★★★Studied

FromDesign Patterns (GoF)大話設計模式Design Patterns Explained

📚 From the Books

代理 (Proxy)ConceptStructural

用一個同介面的替身站在真實物件前面,控制對它的存取——延遲建立、權限檢查、快取或遠端轉發——而 client 感覺不到差別。

🧠 When to Use

TIP

訊號:你想在「呼叫真實物件」前後插入控制(先檢查權限、先看快取、用到才載入),但不想改 client、也不想改真實物件的介面

⚖️ Structure & Variants

Virtual Proxy — 延遲載入
interface Image { fun render() }

// 真實物件:建立成本高(讀檔、解碼)
class RealImage(private val path: String) : Image {
    init { /* 從磁碟載入、解碼,很貴 */ }
    override fun render() { /* draw pixels */ }
}

// Proxy:同介面,真正 render 時才建立 RealImage
class ImageProxy(private val path: String) : Image {
    private val real: RealImage by lazy { RealImage(path) }
    override fun render() = real.render()
}

val img: Image = ImageProxy("big.png")   // 此時尚未載入
img.render()                             // 此刻才真的載入
  • 關鍵:Proxy 實作同一介面,client 拿到的就像真實物件。
Protection Proxy — 權限控制
  • 呼叫真實物件前先檢查身分 / 權限,未通過就拋例外或回傳預設值。
  • 把存取控制集中在 proxy,真實物件保持單純、專注本業。
和 Decorator / Adapter 的差別
  • Proxy:介面不變,控制存取,通常不疊加、由 proxy 自己決定何時/能否轉呼叫。
  • Decorator:介面不變,加強行為,設計上可一層層疊加。
  • Adapter改變介面,目的是相容。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading