設(shè)計模式-委派模式

設(shè)計模式-委派模式

定義

委派模式(Delegate Pattern)又叫委托模式,是一種面向?qū)ο蟮脑O(shè)計模式,允許對象組合實現(xiàn)與繼承相同的代碼重用.它的基本作用就是負責任務(wù)的調(diào)用和分配任務(wù),是一種特殊的靜態(tài)代理,可以理解為全權(quán)代理,但是代理模式注重過程,而委派模式注重結(jié)果.委派模式屬于行為型模式,不屬于GOF23種設(shè)計模式.


委派模式在Spring中應(yīng)用非常多,大家常用的DispatcherServlet其實就是用到了委派模式.先來看一下類圖:

委派模式UML類圖

從類圖中我們可以看到,委派模式有三個參與角色:

1、抽象任務(wù)角色(Task):定義一個抽象接口,它有若干實現(xiàn)類.

2、委派者角色(Delegate):負責在各個具體角色實例之間做出決策,并判斷和調(diào)用具體實現(xiàn)的方法.

3、具體任務(wù)角色(Concrete):真正執(zhí)行任務(wù)的角色.

委派模式的應(yīng)用場景

現(xiàn)實生活中也常有委派的場景發(fā)生,例如:老板(Boss)給項目經(jīng)理(Leader)下達任務(wù),項目經(jīng)理會根據(jù)實際情況給每個員工派發(fā)工作任務(wù),待員工把工作任務(wù)完成之后,再由項目經(jīng)理匯報工作進度或結(jié)果給老板.

抽象任務(wù)角色
具體任務(wù)角色A
具體任務(wù)角色B
委派者角色
Boss類
測試代碼
運行結(jié)果

通過上面的案例,生動地還原了項目經(jīng)理分配工作的業(yè)務(wù)場景,也是委派模式的主動體現(xiàn).下面我們看一下類圖:

上述案例類圖

委派模式在源碼中的應(yīng)用

JDK中有一個經(jīng)典的委派,眾所周知JVM在加載類時,使用的是雙親委派模型,什么是雙親委派模型?

一個類加載器在加載類時,先把這個請求委派給自己的父類加載器去執(zhí)行,如果父類加載器還存在父類加載器,就繼續(xù)向上委派,直到頂層的啟動類加載器.如果父類加載器能夠完成類加載,就成功返回,如果父類加載器無法完成加載,那么子加載器才會嘗試自己去加載.(注意:不要被雙親這個翻譯給誤導(dǎo)了,原文Parent被翻譯成了雙親...其實就是簡單的父類,不要看到"雙"字就想入非非~)

從定義中,我們可以看到,雙親加載器模型:一個類加載器加載時首先不是自己加載,而是委派給父類加載器.

下面我們來看看loadClass()方法的源碼,此方法在ClassLoader中.在這個類里就定義了一個雙親(即:父類),用于下面的類加載.

雙親委派模型中的類加載方法

從上述源碼,我們可以發(fā)現(xiàn):此方法的默認實現(xiàn)按以下順序搜索類:

1、調(diào)用findLoadedClass(String)來檢查類是否已經(jīng)加載。

2、在父類加載器上調(diào)用loadClass方法。如果 parent 為null ,則使用虛擬機內(nèi)置的類加載器。

3、調(diào)用findClass(String)方法來查找類。


同樣,在Method類里我們常用的代理執(zhí)行方法invoke()也存在類似的機制.

Method類中的invoke()方法

看完代碼,相信小伙伴們能夠搞清楚委派和代理的區(qū)別了吧.

委派模式的優(yōu)點

通過任務(wù)委派能夠將一個大型的任務(wù)細化,然后通過統(tǒng)一管理這些子任務(wù)的完成情況,實現(xiàn)任務(wù)的跟進,能夠提高任務(wù)的執(zhí)行效率.

委派模式的缺點

任務(wù)委派方式需要根據(jù)任務(wù)的復(fù)雜程度進行不同的改變,在任務(wù)比較復(fù)雜的情況下可能需要進行多重委派,容易造成紊亂.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容