意圖:
代理模式為另一個物件提供一個替身或者佔位符以控制對這個物件的訪問
關鍵程式碼:
代理類和被代理類實現同一介面,代理類中持有被代理類物件
應用例項:
- 火車票的代理售票點。代售點就是代理,它擁有被代理物件的部分功能—售票功能
- 明星的經紀人,經紀人就是代理,負責為明星處理一些事務。
Go實現代理模式
package proxy
import "fmt"
type Seller interface {
sell(name string)
}
// 火車站
type Station struct {
stock int //庫存
}
func (station *Station) sell(name string) {
if station.stock > 0 {
station.stock--
fmt.Printf("代理點中:%s買了一張票,剩餘:%d \n", name, station.stock)
} else {
fmt.Println("票已售空")
}
}
// 火車代理點
type StationProxy struct {
station *Station // 持有一個火車站物件
}
func (proxy *StationProxy) sell(name string) {
if proxy.station.stock > 0 {
proxy.station.stock--
fmt.Printf("代理點中:%s買了一張票,剩餘:%d \n", name, proxy.station.stock)
} else {
fmt.Println("票已售空")
}
}
測試用例
package proxy
import "testing"
func TestProxy(t *testing.T) {
station := &Station{3}
proxy := &StationProxy{station}
station.sell("小華")
proxy.sell("派大星")
proxy.sell("小明")
proxy.sell("小蘭")
}
具體程式碼
更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star
,你的支援,是我最大的動力!
本作品採用《CC 協議》,轉載必須註明作者和本文連結