摘要:代理模式為一個(gè)對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。
本文分享自華為云社區(qū)《【Go實(shí)現(xiàn)】實(shí)踐GoF的23種設(shè)計(jì)模式:代理模式》,作者:元閏子 。
我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、布爾津ssl等。為超過(guò)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的布爾津網(wǎng)站制作公司
GoF 對(duì)代理模式(Proxy Pattern)的定義如下:
Provide a surrogate or placeholder for another object to control access to it.
也即,代理模式為一個(gè)對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。
它是一個(gè)使用率非常高的設(shè)計(jì)模式,在現(xiàn)實(shí)生活中,也是很常見(jiàn)。比如,演唱會(huì)門(mén)票黃牛。假設(shè)你需要看一場(chǎng)演唱會(huì),但官網(wǎng)上門(mén)票已經(jīng)售罄,于是就當(dāng)天到現(xiàn)場(chǎng)通過(guò)黃牛高價(jià)買(mǎi)了一張。在這個(gè)例子中,黃牛就相當(dāng)于演唱會(huì)門(mén)票的代理,在正式渠道無(wú)法購(gòu)買(mǎi)門(mén)票的情況下,你通過(guò)代理完成了該目標(biāo)。
從演唱會(huì)門(mén)票的例子我們也能看出,使用代理模式的關(guān)鍵在于,當(dāng) Client 不方便直接訪問(wèn)一個(gè)對(duì)象時(shí),提供一個(gè)代理對(duì)象控制該對(duì)象的訪問(wèn)。Client 實(shí)際上訪問(wèn)的是代理對(duì)象,代理對(duì)象會(huì)將 Client 的請(qǐng)求轉(zhuǎn)給本體對(duì)象去處理。
在簡(jiǎn)單的分布式應(yīng)用系統(tǒng)(示例代碼工程)中,db 模塊用來(lái)存儲(chǔ)服務(wù)注冊(cè)和監(jiān)控信息,它是一個(gè) key-value 數(shù)據(jù)庫(kù)。為了提升訪問(wèn)數(shù)據(jù)庫(kù)的性能,我們決定為它新增一層緩存:
另外,我們希望客戶端在使用數(shù)據(jù)庫(kù)時(shí),并不感知緩存的存在,這些,代理模式可以做到。
// demo/db/cache.go package db // 關(guān)鍵點(diǎn)1: 定義代理對(duì)象,實(shí)現(xiàn)被代理對(duì)象的接口 type CacheProxy struct { // 關(guān)鍵點(diǎn)2: 組合被代理對(duì)象,這里應(yīng)該是抽象接口,提升可擴(kuò)展性 db Db cache sync.Map// key為tableName,value為sync.Map[key: primaryId, value: interface{}] hit int missint } // 關(guān)鍵點(diǎn)3: 在具體接口實(shí)現(xiàn)上,嵌入代理本身的邏輯 func (c *CacheProxy) Query(tableName string, primaryKey interface{}, result interface{}) error { cache, ok := c.cache.Load(tableName) if ok { if record, ok := cache.(*sync.Map).Load(primaryKey); ok { c.hit++ result= record return nil } } c.miss++ if err := c.db.Query(tableName, primaryKey, result); err != nil { return err } cache.(*sync.Map).Store(primaryKey, result) return nil } func (c*CacheProxy) Insert(tableName string, primaryKey interface{}, record interface{}) error { if err := c.db.Insert(tableName, primaryKey, record); err != nil { return err } cache, ok := c.cache.Load(tableName) if !ok { return nil } cache.(*sync.Map).Store(primaryKey, record) return nil } ... // 關(guān)鍵點(diǎn)4: 代理也可以有自己特有方法,提供一些輔助的功能 func (c *CacheProxy) Hit() int { return c.hit } func (c*CacheProxy) Miss() int { return c.miss } ...
當(dāng)前題目:實(shí)踐GoF的設(shè)計(jì)模式:代理模式
分享地址:http://chinadenli.net/article4/dsoicoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、商城網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、外貿(mào)建站、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)