代理模式
Proxy代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,主要解決的問題是:在直接訪問對象時(shí)帶來的問題,比如說:要訪問的對象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對象由于某些原因(比如對象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問),直接訪問會給使用者或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩,我們可以在訪問此對象時(shí)加上一個對此對象的訪問層。如下圖:
比如說C和A不在一個服務(wù)器上,A要頻繁的調(diào)用C,我們可以在A上做一個代理類Proxy,把訪問C的工作交給Proxy,這樣對于A來說,就好像在直接訪問C的對象。在對A的開發(fā)中我們可以把注意力完全放在業(yè)務(wù)的實(shí)現(xiàn)上。
GoF《設(shè)計(jì)模式》中說道:為其他對象提供一種代理以控制這個對象的訪問。
Proxy模式的結(jié)構(gòu):
通過代理模式以客戶透明的形式動態(tài)的為目標(biāo)對象加以行為控制
實(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),對客戶來說代理類就是一個偽賬戶類,對代理類做操作的時(shí)候,其實(shí)就是在對真實(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
這樣我們就可以在對調(diào)用目標(biāo)對象的同時(shí)增加控制代碼,但是這一切都是以透明的方式展示給客戶,對客戶來說就跟調(diào)用普通的BankAccount對象方法一樣
bankAccount = BankAccount.new
bankAccount.deposit
proxy = Proxy.new bankAccount
proxy.deposit
Proxy模式的要點(diǎn):
1、“增加一層間接層”是軟件系統(tǒng)中對許多負(fù)責(zé)問題的一種常見解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對象會帶來很多問題,作為間接層的proxy對象便是解決這一問題的常用手段。
在我們?nèi)粘5墓ぷ髦幸渤3S玫酱砟J?,比如對于三層結(jié)構(gòu)或者N- tiers結(jié)構(gòu)中DAL數(shù)據(jù)訪問層,它把對數(shù)據(jù)庫的訪問進(jìn)行封裝。BLL業(yè)務(wù)層的開發(fā)者只是調(diào)用DAL中的方法來獲得數(shù)據(jù)。
再比如前一段時(shí)間看了看AOP和Remoting方面的資料,對于跨越應(yīng)用程序域的訪問,要為客戶應(yīng)用程序提供一個TransparentProxy(透明代理),客戶程序?qū)嶋H上是通過訪問這個代理來訪問實(shí)際的類型對象。
2、具體proxy設(shè)計(jì)模式的實(shí)現(xiàn)方法、實(shí)現(xiàn)粒度都相差很大,有些可能對單個對象作細(xì)粒度的控制,有些可能對組件模塊提供抽象代理層,在架構(gòu)層次對對象作proxy。
3、proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時(shí)候損及一些透明性是可以接受的。例如上面的那個例子,代理類型ProxyClass和被代理類型LongDistanceClass可以不用繼承自同一個接口,正像GoF《設(shè)計(jì)模式》中說的:為其他對象提供一種代理以控制這個對象的訪問。代理類型從某種角度上講也可以起到控制被代理類型的訪問的作用。
您可能感興趣的文章:- 設(shè)計(jì)模式中的觀察者模式在Ruby編程中的運(yùn)用實(shí)例解析
- 實(shí)例解析Ruby設(shè)計(jì)模式開發(fā)中對觀察者模式的實(shí)現(xiàn)
- 深入剖析Ruby設(shè)計(jì)模式編程中對命令模式的相關(guān)使用
- Ruby設(shè)計(jì)模式編程中對外觀模式的應(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ì)模式編程中對單例模式的運(yùn)用
- Ruby設(shè)計(jì)模式編程之適配器模式實(shí)戰(zhàn)攻略
- Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例
- Ruby中使用設(shè)計(jì)模式中的簡單工廠模式和工廠方法模式