概念
代理模式: 為其他對象提供一種代理以控制對這個對象的訪問
代理模式用于延遲處理操作或者在進(jìn)行實(shí)際操作前,先進(jìn)行其它處理
具體實(shí)現(xiàn):
- 定義一個Subject接口, 接口定義了一些方法
- 定義一個真實(shí)要隱藏的接口實(shí)現(xiàn)者
- 定義一個代理實(shí)現(xiàn)者悯仙, 代理接口包含真實(shí)實(shí)現(xiàn)者, 調(diào)用代理接口赎瑰, 可以在代理接口函數(shù)調(diào)用到真實(shí)接口。
模式的場景和優(yōu)缺點(diǎn)
使用場景
- 遠(yuǎn)程代理, 也就是為了一個對象在不同的地址空間提供局部代表破镰, 這樣可以隱藏一個對象存在于不同地址空間的事實(shí)餐曼。
- 虛擬代理, 是根據(jù)需要創(chuàng)建開銷很大的對象啤咽。 通過它來存放實(shí)例化需要很長時間的真實(shí)對象晋辆。
- 安全代理渠脉, 用來控制真是對象訪問時的權(quán)限宇整。
優(yōu)點(diǎn)
- 職責(zé)清晰
- 高擴(kuò)展性
- 智能化
缺點(diǎn)
- 由于在客戶端和真實(shí)主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢
- 實(shí)現(xiàn)代理模式需要額外的工作芋膘,有些代理模式的實(shí)現(xiàn)非常復(fù)雜
代碼實(shí)現(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)限驗(yàn)證工作...")
// 在調(diào)用真實(shí)對象之前的工作鳞青,檢查緩存霸饲,判斷權(quán)限,實(shí)例化真實(shí)對象等臂拓。
res += "pre:"
// 調(diào)用真實(shí)對象
res += p.real.Do()
// 調(diào)用之后的操作厚脉,如緩存結(jié)果,對結(jié)果進(jìn)行處理等胶惰。傻工。
res += ":after"
return res
}
func main() {
var sub Subject
sub = &Proxy{}
res := sub.Do()
fmt.Printf("res:%s\n", res)
}