解析proxy代理模式在Ruby設(shè)計(jì)模式開(kāi)發(fā)中的運(yùn)用
代理模式
Proxy代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,主要解決的問(wèn)題是:在直接訪問(wèn)對(duì)象時(shí)帶來(lái)的問(wèn)題,比如說(shuō):要訪問(wèn)的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對(duì)象由于某些原因(比如對(duì)象創(chuàng)建開(kāi)銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問(wèn)),直接訪問(wèn)會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來(lái)很多麻煩,我們可以在訪問(wèn)此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪問(wèn)層。如下圖:
比如說(shuō)C和A不在一個(gè)服務(wù)器上,A要頻繁的調(diào)用C,我們可以在A上做一個(gè)代理類Proxy,把訪問(wèn)C的工作交給Proxy,這樣對(duì)于A來(lái)說(shuō),就好像在直接訪問(wèn)C的對(duì)象。在對(duì)A的開(kāi)發(fā)中我們可以把注意力完全放在業(yè)務(wù)的實(shí)現(xiàn)上。
GoF《設(shè)計(jì)模式》中說(shuō)道:為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)。
Proxy模式的結(jié)構(gòu):
通過(guò)代理模式以客戶透明的形式動(dòng)態(tài)的為目標(biāo)對(duì)象加以行為控制
實(shí)例
class BankAccount def deposit p "store the money" end end class Proxy attr_accessor :bankAccount def initialize bankAccount @bankAccount = bankAccount end def deposit @bankAccount.deposit end end
創(chuàng)建銀行賬戶類,再創(chuàng)建代理類,代理類聚合銀行賬戶類,提供相同的行為結(jié)構(gòu),對(duì)客戶來(lái)說(shuō)代理類就是一個(gè)偽賬戶類,對(duì)代理類做操作的時(shí)候,其實(shí)就是在對(duì)真實(shí)的銀行類做操作。
加以行為控制:
class Proxy attr_accessor :bankAccount def initialize bankAccount @bankAccount = bankAccount end def deposit check_something @bankAccount.deposit end def check_something #do some checking code end end
這樣我們就可以在對(duì)調(diào)用目標(biāo)對(duì)象的同時(shí)增加控制代碼,但是這一切都是以透明的方式展示給客戶,對(duì)客戶來(lái)說(shuō)就跟調(diào)用普通的BankAccount對(duì)象方法一樣
bankAccount = BankAccount.new bankAccount.deposit proxy = Proxy.new bankAccount proxy.deposit
Proxy模式的要點(diǎn):
1、“增加一層間接層”是軟件系統(tǒng)中對(duì)許多負(fù)責(zé)問(wèn)題的一種常見(jiàn)解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對(duì)象會(huì)帶來(lái)很多問(wèn)題,作為間接層的proxy對(duì)象便是解決這一問(wèn)題的常用手段。
在我們?nèi)粘5墓ぷ髦幸渤3S玫酱砟J?,比如?duì)于三層結(jié)構(gòu)或者N- tiers結(jié)構(gòu)中DAL數(shù)據(jù)訪問(wèn)層,它把對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)進(jìn)行封裝。BLL業(yè)務(wù)層的開(kāi)發(fā)者只是調(diào)用DAL中的方法來(lái)獲得數(shù)據(jù)。
再比如前一段時(shí)間看了看AOP和Remoting方面的資料,對(duì)于跨越應(yīng)用程序域的訪問(wèn),要為客戶應(yīng)用程序提供一個(gè)TransparentProxy(透明代理),客戶程序?qū)嶋H上是通過(guò)訪問(wèn)這個(gè)代理來(lái)訪問(wèn)實(shí)際的類型對(duì)象。
2、具體proxy設(shè)計(jì)模式的實(shí)現(xiàn)方法、實(shí)現(xiàn)粒度都相差很大,有些可能對(duì)單個(gè)對(duì)象作細(xì)粒度的控制,有些可能對(duì)組件模塊提供抽象代理層,在架構(gòu)層次對(duì)對(duì)象作proxy。
3、proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時(shí)候損及一些透明性是可以接受的。例如上面的那個(gè)例子,代理類型ProxyClass和被代理類型LongDistanceClass可以不用繼承自同一個(gè)接口,正像GoF《設(shè)計(jì)模式》中說(shuō)的:為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)。代理類型從某種角度上講也可以起到控制被代理類型的訪問(wèn)的作用。
- 設(shè)計(jì)模式中的觀察者模式在Ruby編程中的運(yùn)用實(shí)例解析
- 實(shí)例解析Ruby設(shè)計(jì)模式開(kāi)發(fā)中對(duì)觀察者模式的實(shí)現(xiàn)
- 深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用
- Ruby設(shè)計(jì)模式編程中對(duì)外觀模式的應(yīng)用實(shí)例分析
- 詳解組合模式的結(jié)構(gòu)及其在Ruby設(shè)計(jì)模式編程中的運(yùn)用
- 設(shè)計(jì)模式中的模板方法模式在Ruby中的應(yīng)用實(shí)例兩則
- 實(shí)例解析Ruby設(shè)計(jì)模式編程中Strategy策略模式的使用
- 實(shí)例講解Ruby使用設(shè)計(jì)模式中的裝飾器模式的方法
- Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例
- 詳解Ruby設(shè)計(jì)模式編程中對(duì)單例模式的運(yùn)用
- Ruby設(shè)計(jì)模式編程之適配器模式實(shí)戰(zhàn)攻略
- Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例
- Ruby中使用設(shè)計(jì)模式中的簡(jiǎn)單工廠模式和工廠方法模式
相關(guān)文章
在Ruby中利用Net::SMTP類發(fā)送電子郵件的教程
這篇文章主要介紹了在Ruby中利用Net::SMTP類發(fā)送電子郵件的教程,包括類中所帶方法的用法介紹,需要的朋友可以參考下2015-05-05Windows下安裝配置Ruby的debug工具ruby-debug-base19
這篇文章主要介紹了Windows下安裝配置Ruby的debug工具ruby-debug-base19的方法,同時(shí)講解了Ruby的IDE RubyMine中的相關(guān)配置方法,需要的朋友可以參考下2016-03-03ruby實(shí)現(xiàn)github第三方認(rèn)證
GitHub在用戶認(rèn)證過(guò)程中采用了雙匙機(jī)制,在雙匙加密機(jī)制中,只有合法用戶才擁有私匙,只要GitHub在收到請(qǐng)求時(shí)可以證明提交請(qǐng)求的客戶端上擁有該私匙,即可以確認(rèn)該操作是由合法用戶發(fā)起的。我們通過(guò)ruby來(lái)簡(jiǎn)單模擬下吧。2015-06-06編寫Ruby代碼注釋時(shí)需要注意的一些問(wèn)題
這篇文章主要介紹了編寫Ruby代碼注釋時(shí)需要注意的一些問(wèn)題,特別是在團(tuán)隊(duì)協(xié)作時(shí)好的注釋能大大增加代碼的可讀性,需要的朋友可以參考下2015-08-08使用RVM實(shí)現(xiàn)控制切換Ruby/Rails版本
RVM 是Ruby Version Manager的縮寫,是一個(gè)命令行工具,它可以讓你輕松地安裝,管理和使用多個(gè)版本的Ruby.不同的rails項(xiàng)目使用等ruby和rails版本不一樣的時(shí)候,可以使用RVM自由切換。2017-06-06舉例理解Ruby on Rails的頁(yè)面緩存機(jī)制
這篇文章主要介紹了舉例理解Ruby on Rails的頁(yè)面緩存機(jī)制,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04關(guān)于Ruby on Rails視圖編寫的一些建議
這篇文章主要介紹了關(guān)于Ruby on Rails視圖編寫的一些建議,有助于團(tuán)隊(duì)協(xié)作時(shí)對(duì)代碼的調(diào)試工作,需要的朋友可以參考下2015-08-08簡(jiǎn)單介紹Ruby on Rails對(duì)PostgreSQL數(shù)組類型的支持
這篇文章主要介紹了簡(jiǎn)單介紹Ruby on Rails對(duì)PostgreSQL數(shù)組類型的支持,Rails框架從4.0以后對(duì)PG的數(shù)組提供了支持,需要的朋友可以參考下2015-04-04