深入理解Go設(shè)計(jì)模式之代理模式

go
小云
87
2023-08-08 12:47:08

代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許通過(guò)創(chuàng)建一個(gè)代理對(duì)象來(lái)控制對(duì)另一個(gè)對(duì)象的訪問(wèn)。代理對(duì)象充當(dāng)了原始對(duì)象的代理,允許在訪問(wèn)原始對(duì)象之前或之后進(jìn)行一些額外的操作。

在Go語(yǔ)言中,可以使用接口來(lái)定義代理對(duì)象和原始對(duì)象的共同行為。代理對(duì)象實(shí)現(xiàn)了這個(gè)接口,并持有一個(gè)原始對(duì)象的引用,可以在必要時(shí)調(diào)用原始對(duì)象的方法。

代理模式有以下幾種常見(jiàn)的應(yīng)用場(chǎng)景:

  1. 遠(yuǎn)程代理:代理對(duì)象可以將請(qǐng)求傳遞給遠(yuǎn)程服務(wù)器,并將結(jié)果返回給客戶端。這樣,客戶端可以通過(guò)代理對(duì)象訪問(wèn)遠(yuǎn)程服務(wù)器上的對(duì)象,而無(wú)需直接與遠(yuǎn)程服務(wù)器進(jìn)行通信。

  2. 虛擬代理:代理對(duì)象可以在需要的時(shí)候創(chuàng)建和初始化原始對(duì)象。這樣可以延遲原始對(duì)象的創(chuàng)建,節(jié)省系統(tǒng)資源。

  3. 安全代理:代理對(duì)象可以驗(yàn)證客戶端的權(quán)限,并只允許有權(quán)限的客戶端訪問(wèn)原始對(duì)象。這樣可以確保原始對(duì)象的安全性。

  4. 緩存代理:代理對(duì)象可以緩存原始對(duì)象的結(jié)果,并在下次相同的請(qǐng)求時(shí)直接返回緩存結(jié)果。這樣可以提高系統(tǒng)的性能。

下面是一個(gè)示例代碼,展示了如何使用代理模式:

package main
import "fmt"
// 定義共同行為的接口
type Image interface {
Display()
}
// 原始對(duì)象
type RealImage struct {
filename string
}
func NewRealImage(filename string) *RealImage {
fmt.Println("Loading image:", filename)
return &RealImage{filename: filename}
}
func (r *RealImage) Display() {
fmt.Println("Displaying image:", r.filename)
}
// 代理對(duì)象
type ProxyImage struct {
filename string
realImage *RealImage
}
func NewProxyImage(filename string) *ProxyImage {
return &ProxyImage{filename: filename}
}
func (p *ProxyImage) Display() {
if p.realImage == nil {
p.realImage = NewRealImage(p.filename)
}
p.realImage.Display()
}
func main() {
// 創(chuàng)建代理對(duì)象
image := NewProxyImage("image.jpg")
// 第一次顯示圖片,會(huì)加載并顯示
image.Display()
// 第二次顯示圖片,直接顯示緩存結(jié)果
image.Display()
}

輸出結(jié)果為:

Loading image: image.jpg
Displaying image: image.jpg
Displaying image: image.jpg

在上面的示例中,RealImage是原始對(duì)象,實(shí)現(xiàn)了Image接口。ProxyImage是代理對(duì)象,也實(shí)現(xiàn)了Image接口,并持有一個(gè)RealImage對(duì)象的引用。在ProxyImageDisplay方法中,首先檢查realImage是否為空,如果為空,則創(chuàng)建一個(gè)新的RealImage對(duì)象并賦值給realImage,然后調(diào)用realImageDisplay方法。這樣,在第一次調(diào)用Display方法時(shí),會(huì)加載并顯示圖片,第二次調(diào)用時(shí),直接從緩存中顯示圖片。

通過(guò)使用代理模式,可以將一些常用的操作,例如遠(yuǎn)程訪問(wèn)、權(quán)限驗(yàn)證、緩存等,從原始對(duì)象中分離出來(lái),并由代理對(duì)象來(lái)處理,提高了系統(tǒng)的靈活性和可維護(hù)性。

0