代理模式

概念

代理模式: 為其他對象提供一種代理以控制對這個對象的訪問

代理模式用于延遲處理操作或者在進行實際操作前,先進行其它處理

具體實現(xiàn):

  1. 定義一個Subject接口, 接口定義了一些方法
  2. 定義一個真實要隱藏的接口實現(xiàn)者
  3. 定義一個代理實現(xiàn)者, 代理接口包含真實實現(xiàn)者, 調(diào)用代理接口, 可以在代理接口函數(shù)調(diào)用到真實接口。

模式的場景和優(yōu)缺點

使用場景

  1. 遠程代理, 也就是為了一個對象在不同的地址空間提供局部代表, 這樣可以隱藏一個對象存在于不同地址空間的事實。
  2. 虛擬代理, 是根據(jù)需要創(chuàng)建開銷很大的對象。 通過它來存放實例化需要很長時間的真實對象。
  3. 安全代理, 用來控制真是對象訪問時的權(quán)限。

優(yōu)點

  • 職責(zé)清晰
  • 高擴展性
  • 智能化

缺點

  • 由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢
  • 實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復(fù)雜

代碼實現(xiàn)


package main

import "fmt"

// Subject ...
type Subject interface {
    Do() string
}

// RealSubject ...
type RealSubject struct{}

// Do ...
func (RealSubject) Do() string {
    return "real"
}

// Proxy ...
type Proxy struct {
    real RealSubject
}

// Do ...
func (p Proxy) Do() string {
    var res string

    fmt.Println("一些權(quán)限驗證工作...")
    // 在調(diào)用真實對象之前的工作,檢查緩存,判斷權(quán)限,實例化真實對象等。
    res += "pre:"

    // 調(diào)用真實對象
    res += p.real.Do()

    // 調(diào)用之后的操作,如緩存結(jié)果,對結(jié)果進行處理等。。
    res += ":after"

    return res
}
func main() {

    var sub Subject
    sub = &Proxy{}

    res := sub.Do()

    fmt.Printf("res:%s\n", res)
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容