概念
代理模式: 為其他對象提供一種代理以控制對這個對象的訪問
代理模式用于延遲處理操作或者在進行實際操作前,先進行其它處理
具體實現(xiàn):
- 定義一個Subject接口, 接口定義了一些方法
- 定義一個真實要隱藏的接口實現(xiàn)者
- 定義一個代理實現(xiàn)者, 代理接口包含真實實現(xiàn)者, 調(diào)用代理接口, 可以在代理接口函數(shù)調(diào)用到真實接口。
模式的場景和優(yōu)缺點
使用場景
- 遠程代理, 也就是為了一個對象在不同的地址空間提供局部代表, 這樣可以隱藏一個對象存在于不同地址空間的事實。
- 虛擬代理, 是根據(jù)需要創(chuàng)建開銷很大的對象。 通過它來存放實例化需要很長時間的真實對象。
- 安全代理, 用來控制真是對象訪問時的權(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)
}