設(shè)計模式-委派模式
定義
委派模式(Delegate Pattern)又叫委托模式,是一種面向?qū)ο蟮脑O(shè)計模式,允許對象組合實現(xiàn)與繼承相同的代碼重用.它的基本作用就是負責任務(wù)的調(diào)用和分配任務(wù),是一種特殊的靜態(tài)代理,可以理解為全權(quán)代理,但是代理模式注重過程,而委派模式注重結(jié)果.委派模式屬于行為型模式,不屬于GOF23種設(shè)計模式.
委派模式在Spring中應(yīng)用非常多,大家常用的DispatcherServlet其實就是用到了委派模式.先來看一下類圖:

從類圖中我們可以看到,委派模式有三個參與角色:
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é)果給老板.







通過上面的案例,生動地還原了項目經(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()也存在類似的機制.

看完代碼,相信小伙伴們能夠搞清楚委派和代理的區(qū)別了吧.
委派模式的優(yōu)點
通過任務(wù)委派能夠將一個大型的任務(wù)細化,然后通過統(tǒng)一管理這些子任務(wù)的完成情況,實現(xiàn)任務(wù)的跟進,能夠提高任務(wù)的執(zhí)行效率.
委派模式的缺點
任務(wù)委派方式需要根據(jù)任務(wù)的復(fù)雜程度進行不同的改變,在任務(wù)比較復(fù)雜的情況下可能需要進行多重委派,容易造成紊亂.