說說設(she)計模式~委派模式
概述
委(wei)派模(mo)(mo)(mo)式(shi)(shi)(Delegate Pattern)又叫作委(wei)托模(mo)(mo)(mo)式(shi)(shi),是一種(zhong)面向對象(xiang)的(de)設計(ji)模(mo)(mo)(mo)式(shi)(shi),允許對象(xiang)組合實現與繼承相同(tong)的(de)代(dai)(dai)碼重(zhong)用。它的(de)基本作用就是負責任務的(de)調用和(he)分配(pei),是一種(zhong)特(te)殊的(de)靜態代(dai)(dai)理模(mo)(mo)(mo)式(shi)(shi),可以理解為(wei)全權代(dai)(dai)理模(mo)(mo)(mo)式(shi)(shi),但(dan)是代(dai)(dai)理模(mo)(mo)(mo)式(shi)(shi)注(zhu)重(zhong)過程(cheng),而委(wei)派模(mo)(mo)(mo)式(shi)(shi)注(zhu)重(zhong)結果。委(wei)派模(mo)(mo)(mo)式(shi)(shi)屬(shu)于行為(wei)型設計(ji)模(mo)(mo)(mo)式(shi)(shi),不屬(shu)于GoF的(de)23種(zhong)設計(ji)模(mo)(mo)(mo)式(shi)(shi)。
使用場景
-
任(ren)務(wu)分(fen)發:當一個任(ren)務(wu)需要被(bei)分(fen)發給多個不同的(de)執(zhi)行者來完(wan)成時,委(wei)派(pai)(pai)(pai)模式(shi)可以將(jiang)任(ren)務(wu)的(de)分(fen)發和執(zhi)行解(jie)耦。委(wei)派(pai)(pai)(pai)者負責(ze)接收任(ren)務(wu)并將(jiang)任(ren)務(wu)委(wei)派(pai)(pai)(pai)給具體的(de)執(zhi)行者進行處理。
-
復雜(za)任(ren)務處理:當一個(ge)任(ren)務較為復雜(za),需要由多個(ge)不同(tong)的(de)子任(ren)務協同(tong)完成時,委派模式可(ke)以(yi)將(jiang)任(ren)務拆分(fen)成多個(ge)子任(ren)務,由不同(tong)的(de)執行者負責處理各自的(de)子任(ren)務。
-
中央調度(du):當需(xu)要一個中央調度(du)者來協調和(he)管(guan)理多個任(ren)務的執行時,委派模式可以使中央調度(du)者作為委派者,將任(ren)務委派給不同的執行者來完成。
-
策略選擇:當(dang)根據不(bu)同(tong)的條件或參數選擇不(bu)同(tong)的策略或實(shi)現方(fang)式時,委派模式可以根據條件選擇合適(shi)的實(shi)現類來執行任務。
-
事件(jian)驅動(dong):當事件(jian)觸發后需(xu)要(yao)將(jiang)(jiang)事件(jian)分發給(gei)(gei)不同的(de)(de)處理(li)者來(lai)處理(li)時,委派模式可(ke)以(yi)作為事件(jian)的(de)(de)委派者,根(gen)據事件(jian)的(de)(de)類型將(jiang)(jiang)事件(jian)分發給(gei)(gei)對應(ying)的(de)(de)處理(li)者進行處理(li)。
總而言(yan)之,委派模式適(shi)用于任務分(fen)(fen)發和執行(xing)的(de)場(chang)景,可以將任務的(de)分(fen)(fen)發和執行(xing)進行(xing)解耦,提高代碼(ma)的(de)可維護性和擴展性,同時(shi)實現任務的(de)靈活分(fen)(fen)配(pei)和處(chu)理。
在代碼中的體現
下面(mian)是一(yi)個簡(jian)單的示(shi)例(li),使用(yong)Java代(dai)碼演示(shi)委(wei)派(pai)模式的實現:
// 委派任務的接口
public interface Task {
void execute();
}
// 具體的任務實現類A
public class TaskA implements Task {
@Override
public void execute() {
System.out.println("執行任務A");
}
}
// 具體的任務實現類B
public class TaskB implements Task {
@Override
public void execute() {
System.out.println("執行任務B");
}
}
// 委派者
public class TaskDelegate {
private Task task;
public void setTask(Task task) {
this.task = task;
}
public void doTask() {
task.execute();
}
}
// 客戶端
public class Main {
public static void main(String[] args) {
TaskDelegate delegate = new TaskDelegate();
// 委派給任務A執行
delegate.setTask(new TaskA());
delegate.doTask();
// 委派給任務B執行
delegate.setTask(new TaskB());
delegate.doTask();
}
}
在上面的示例中,Task 接口定義了任務的執行方法 execute(),TaskA 和 TaskB 是具體的任務實現類。TaskDelegate 充當委派者的角色,負責接收任務并將任務委派給具體的實現類來執行。Main 類作為(wei)客戶(hu)端示例,創建委派(pai)者對象并通過設置(zhi)不同的任務來執行。
在這個例子中,TaskDelegate 將任務(wu)的(de)(de)執(zhi)行(xing)(xing)委(wei)(wei)(wei)派給(gei)了(le)不同(tong)(tong)的(de)(de)具體(ti)任務(wu)類(lei),根據設置的(de)(de)任務(wu)類(lei)型,委(wei)(wei)(wei)派者(zhe)會(hui)將任務(wu)分發給(gei)不同(tong)(tong)的(de)(de)實現(xian)類(lei)來執(zhi)行(xing)(xing)。通過委(wei)(wei)(wei)派模式,委(wei)(wei)(wei)派者(zhe)可以將具體(ti)的(de)(de)任務(wu)分發給(gei)不同(tong)(tong)的(de)(de)執(zhi)行(xing)(xing)者(zhe),實現(xian)任務(wu)的(de)(de)靈活分配(pei)和(he)執(zhi)行(xing)(xing)。
在spring中的應用
當(dang)涉(she)及到Spring框架中的委派模式時,最典型的例子就是Spring的核心Web組件(jian)之一——DispatcherServlet。
在Spring MVC中,DispatcherServlet充當了前端(duan)控制器(qi)(Front Controller)的(de)角色(se)。它是客(ke)戶(hu)端(duan)請求的(de)中央調度者,負(fu)責(ze)接(jie)收所有的(de)HTTP請求,并(bing)將請求委派給合適的(de)處(chu)理器(qi)(Handler)進行處(chu)理。
DispatcherServlet的工作流程(cheng)如下:
-
客戶端發起HTTP請求到DispatcherServlet。
-
DispatcherServlet接(jie)收到請求后,根(gen)據請求的URL路徑(或(huo)其(qi)他條件)選擇(ze)合適的處理(li)器來處理(li)請求。
-
DispatcherServlet將請求委派給(gei)選(xuan)擇的處(chu)理(li)器進行(xing)處(chu)理(li)。
-
處理器執行業務(wu)邏輯,生成相應的結果。
-
處(chu)理(li)器將(jiang)結果返回給(gei)DispatcherServlet。
-
DispatcherServlet負責(ze)將處理(li)器的結果進行(xing)包裝,如渲染視圖(tu)、返回JSON數據等。
-
DispatcherServlet將(jiang)最(zui)終結果(guo)返回給(gei)客戶(hu)端。
在這個過程(cheng)中,DispatcherServlet充當了委派者(zhe)的(de)(de)(de)(de)(de)角色,根據請(qing)求(qiu)的(de)(de)(de)(de)(de)URL路(lu)徑選擇合適的(de)(de)(de)(de)(de)處(chu)理(li)(li)(li)(li)器來處(chu)理(li)(li)(li)(li)請(qing)求(qiu)。DispatcherServlet并不(bu)直接處(chu)理(li)(li)(li)(li)請(qing)求(qiu),而是將請(qing)求(qiu)委派給具(ju)體(ti)的(de)(de)(de)(de)(de)處(chu)理(li)(li)(li)(li)器,可(ke)以是Controller類或其他處(chu)理(li)(li)(li)(li)組件(jian)。通過委派模式,DispatcherServlet實現了請(qing)求(qiu)的(de)(de)(de)(de)(de)分發和處(chu)理(li)(li)(li)(li)的(de)(de)(de)(de)(de)解耦,具(ju)體(ti)的(de)(de)(de)(de)(de)處(chu)理(li)(li)(li)(li)邏輯(ji)由(you)處(chu)理(li)(li)(li)(li)器負責完成。
DispatcherServlet的(de)(de)(de)配置(zhi)可以在Spring的(de)(de)(de)配置(zhi)文件(jian)(如XML配置(zhi)文件(jian))中進行,指定(ding)URL路徑和對應的(de)(de)(de)處理(li)器(qi)的(de)(de)(de)映(ying)射關系。這樣,根(gen)據不同的(de)(de)(de)URL路徑,DispatcherServlet就能(neng)夠將請求委派給不同的(de)(de)(de)處理(li)器(qi)進行處理(li)。
需要注意的是,DispatcherServlet不僅僅只使用了委派模式,它還涉及其他設計模式和技術,如適配器模式、模板方法模式、策略模式等,以實現全面的請求處理流程和靈活的擴展機制。
回到目錄