代理、委托、钩子与打桩
代理、委托、鉤子與打樁
- 代理
- 委托
- 鉤子
- 廣義的鉤子
 
- 打樁
代理
??代理(proxy)指的是在需要使用某個(gè)事物時(shí),使用另一個(gè)事物來(lái)代替原本需要的該事物。具體來(lái)說(shuō),若原本需要某個(gè)類的方法,而現(xiàn)在創(chuàng)建了該類的一個(gè)代理類,那么就可以在原本需要使用該類的地方,使用該類的代理類來(lái)替換。
??一般意義下的代理的使用場(chǎng)景有很多,比方說(shuō),可以在原來(lái)類的基礎(chǔ)上實(shí)現(xiàn)更復(fù)雜的功能。具體來(lái)說(shuō),如果需要某個(gè)類 A 的方法 a??梢远x類 A 的代理類 AProxy,并在其同名方法 a 中調(diào)用原來(lái)類 A 的方法 a,這樣一來(lái),代理類 AProxy 的同名方法 a 不僅擁有原來(lái)類 A 的方法 a 的功能,還可以在其基礎(chǔ)上增加其它功能。
委托
??委托(delegate)指的是一個(gè)類在定義的時(shí)候就表示自己只是提供相關(guān)的實(shí)現(xiàn),把運(yùn)行自身代碼這項(xiàng)活動(dòng)交給其它類來(lái)完成。
??委托和代理的聯(lián)系很緊密,但側(cè)重點(diǎn)不同。委托類相當(dāng)于代理中的被代理類(就是上面代理中提到的“原來(lái)類”),被委托類相當(dāng)于代理中的代理類。但代理中的被代理類在設(shè)計(jì)的時(shí)候并不一定要聲明自己以后會(huì)被代理,實(shí)際上,被代理類在設(shè)計(jì)的時(shí)候并不知道自己以后會(huì)被代理。代理只是強(qiáng)調(diào)對(duì)代理類的實(shí)現(xiàn),而不是對(duì)被代理類的實(shí)現(xiàn)。同理,在委托中,側(cè)重點(diǎn)是實(shí)現(xiàn)委托類,至于被委托類應(yīng)該怎么設(shè)計(jì),這不是委托應(yīng)該主要考慮的事情。
??委托類的設(shè)計(jì)是為了遵守設(shè)計(jì)模式中的單一職責(zé)原則,將一個(gè)活動(dòng)的定義與使用分離。
鉤子
??鉤子(hook)指的是一個(gè)程序預(yù)設(shè)的子程序跳轉(zhuǎn)入口。在不同的編程語(yǔ)言、不同場(chǎng)景下,鉤子可以指預(yù)先約定的某一類函數(shù)名、某個(gè)類的接口引用字段等等。
??鉤子在生活中指的是可以鉤住其它東西的一種工具,只要其它東西上有能被鉤子鉤住的圓環(huán)即可。如果我們要使用其它工具,可以先通過鉤子來(lái)獲取該工具,這只需要提前在該工具上安裝一個(gè)圓環(huán)即可。在編程中,這里的圓環(huán)相當(dāng)于一個(gè)約定的接口,只要自己編寫的程序遵守了此約定的規(guī)范,就可以在含鉤子的程序在調(diào)用該程序。
??鉤子和代理也有些淵源。在某種角度上,含鉤子的類也可以看成是一個(gè)代理類。但鉤子和代理的區(qū)別在于,它們?cè)O(shè)計(jì)思路(流程)正好相反。對(duì)于代理,一般來(lái)說(shuō),被代理的類是很早以前就已經(jīng)設(shè)計(jì)好了,而代理類依賴于被代理的類且設(shè)計(jì)時(shí)間晚于被代理類。但對(duì)于鉤子,含鉤子的程序往往是提交已經(jīng)設(shè)計(jì)好了,之后只需要在使用該程序之前,將“圓環(huán)程序”提供該“鉤子程序”,就可以使用該“鉤子程序”了??梢钥闯?#xff0c;雖然“鉤子程序”是依賴“圓環(huán)程序”的,但“圓環(huán)程序”的設(shè)計(jì)時(shí)間與“鉤子程序”相對(duì)獨(dú)立,是可以晚于“鉤子程序”的。另外,“鉤子”并未嚴(yán)格限定“圓環(huán)程序”的內(nèi)容,“圓環(huán)程序”只需要遵守某種約定的規(guī)范,其內(nèi)容可以自由發(fā)揮。這類似于 IoC 思想。如果硬要把代理中的概念與鉤子相對(duì)應(yīng),那么從這個(gè)角度上,代理與鉤子的區(qū)別在于,對(duì)于代理,可以自由發(fā)揮的是代理類,而對(duì)于鉤子,則是被代理類。
廣義的鉤子
??廣義的鉤子指的是一個(gè)可以控制程序流程的一段代碼。但這段代碼與程序其它部分的代碼屬于低耦合,即可以通過不改動(dòng)其它部分的代碼的條件下,任意地更改這段代碼來(lái)控制程序的走向。
??因此,廣義的鉤子不僅包括上面介紹的鉤子,還包括一些類中預(yù)設(shè)的布爾函數(shù),比方說(shuō),可以對(duì)某一系列的類中都設(shè)置一個(gè)布爾函數(shù),然后用該布爾函數(shù)的返回值來(lái)決定程序走向,則該布爾函數(shù)就是一個(gè)廣義的鉤子。
打樁
??在編程中,樁(stub)是指用于模擬真實(shí)環(huán)境的代碼段。在開發(fā)者測(cè)試中,常常需要模擬真實(shí)的環(huán)境來(lái)用于測(cè)試。因?yàn)闃?gòu)建真實(shí)的環(huán)境往往成本很大或者不可能,這就需要模擬。在開發(fā)者測(cè)試中,一個(gè)大型的項(xiàng)目必須要分解成各個(gè)基本的單元,先進(jìn)行單元測(cè)試(UT),然后進(jìn)行集成測(cè)試(IT),最后進(jìn)行系統(tǒng)測(cè)試(ST)。分開測(cè)試的各個(gè)部分的碎片化的模擬環(huán)境稱為樁。樁一般就具體為,對(duì)真實(shí)環(huán)境進(jìn)行模擬所編寫的函數(shù)。對(duì)樁函數(shù)的編寫稱為打樁。
總結(jié)
以上是生活随笔為你收集整理的代理、委托、钩子与打桩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 编程开发使用的辅助软件大全
- 下一篇: 解决 IntelliJ IDEA 内置的
