Spring中常用的設計模式:委派模式
Spring MVC框架中的DispatcherServlet其實就用了委派模式,也有人稱為是代理模式和策略模式的組合。
- 代理模式
使用代理物件來執行目標物件的方法並在代理物件中增強目標物件方法。 - 策略模式
策略模式是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。
代理模式注重的是過程,委派者注重的是結果。
策略模式注重的是可擴充套件(外部擴充套件),委派模式注重的是內部的靈活和複用。
實際應用場景
使用者請求(Boss)將任務委派給專案經理(Leader),Leader將任務細化,根據每個人擅長的某一方面將細化後的任務分給指定的員工(Target)。
Boss,指派任務給Leader
public class Boss {
public static void main(String[] args) {
// new Leader().dispatch("加密");
new Leader().dispatch("銷售");
}
}
普通員工介面 ITarget
public interface ITarget {
public void doing(String command);
}
專案經理(委派者)
public class Leader
{ private Map<String ,ITarget> targets = new HashMap<String ,ITarget>(); public Leader(){ targets.put("加密",new TargetA()); targets.put("銷售",new TargetB()); } public void dispatch(String command){ targets.get(command).doing(command); } }
兩個普通員工類(被委派者)
public class TargetA implements ITarget{
public void doing(String command) {
System.out.println("開始進行加密演算法的實現");
}
}
public class TargetB implements ITarget{
public void doing(String command) {
System.out.println("開始開發銷售程式碼");
}
}
使用者請求相當於Boos,Spring MVC框架中的DispatcherServlet相當於專案經理,其他的解析器相當於員工。
- DispatcherServlet的委託流程
使用者傳送請求——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作為統一訪問點,進行全域性的流程控制。
DispatcherServlet——>HandlerMapping,對映處理器將會把請求對映為HandlerExecutionChain物件(包含一個Handler處理器(頁面控制器)物件、多個HandlerInterceptor攔截器)物件。
DispatcherServlet——>HandlerAdapter,處理器介面卡將會把處理器包裝為介面卡,從而支援多種型別的處理器,即介面卡設計模式的應用,從而很容易支援很多型別的處理器。
DispatcherServlet——> ViewResolver, 檢視解析器將把ModelAndView物件(包含模型資料、邏輯檢視名)解析為具體的View。
DispatcherServlet——>View,View會根據傳進來的Model模型資料進行渲染,此處的Model實際是一個Map資料結構。
返回控制權給DispatcherServlet,由DispatcherServlet返回響應給使用者,到此一個流程結束。