前言:學習目標:精簡程式邏輯,提升代碼的可讀性,內容定位:希望通過對委派模式的學習,讓自己寫出更加優雅的代碼的人群,
一、委派模式定義
- 委派模式(Delegate Pattern)的基本作用是負責任務的調度和分配任務,跟代理模式很像,可以看作是一種特殊情況下的靜態代理的全權代理,但是代理模式注重程序,而委派模式注重結果,
- 不屬于GOF 23中設計模式之一
- 屬于行為型模式
二、常見應用場景案例
- DispatcherServlet
- 類名以Delegate結尾的
- 包含Dispatcher的一般都是委派模式
- Spring框架IOC中的BeanDefinitionParserDelegate:Spring提供多種方式(java、xml、注解)配置bean,該類負責分發處理,注入的bean資訊最侄訓被加載為一個BeanDefition物件(描述物件資訊)
應用場景:解決多任務,又不希望把這些任務或者具體的實作讓用戶知道(不讓用戶直接互動),創建一個中間類,實作全權代理,達到對用戶來說只有一個入口的目的,
三、簡單代碼案例
例子:老板需要安排任務給員工,但是又不能直接讓老板去了解每個員工的擅長職能,就可以創建一個中間的經理職位負責了解職員的特長,分發任務,
boss類
public class Boss {
/**
* 發任務
* @param command
* @param leader
*/
public void command(String command,Leader leader){
leader.doing(command);
}
}
經理類
public class Leader {
// 預先知道每個員工的特長、特征,分發任務
private Map<String,IEmployee> register = new HashMap<String,IEmployee>();
public Leader(){
register.put("加密",new EmployeeA());
register.put("架構",new EmployeeB());
}
public void doing(String command){
// 交給指定的員工去做
register.get(command).doing(command);
}
}
員工介面
public interface IEmployee {
/**
* 做事
* @param command
*/
void doing(String command);
}
員工A
public class EmployeeA implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是員工A,我開始干活了,我擅長加密,執行");
}
}
員工B
public class EmployeeB implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是員工B,我擅長架構,我開始干活了");
}
}
測驗類
public class DelegateTest {
public static void main(String[] args) {
new Boss().command("架構",new Leader());
}
}
四、SpringMvc的DispatcherServlet簡單實作
DispatcherServlet是前端控制器委派模式的實作,提供Spring Web MVC的集中訪問點,負責職責的分派
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>delegateServlet</servlet-name>
<servlet-class>com.zc.pattern.delegate.mvc.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>delegateServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- http://localhost:8080/getMemberById.do -->
</web-app>
DispatcherServlet
package com.zc.pattern.delegate.mvc;
import com.zc.pattern.delegate.mvc.controllers.MemberController;
import com.zc.pattern.delegate.mvc.controllers.OrderController;
import com.zc.pattern.delegate.mvc.controllers.SystemController;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class DispatcherServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 完成調度
doDispach(req,resp);
}
private void doDispach(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String uri = req.getRequestURI();
if ("getMemberById".equals(uri)){
String mid = req.getParameter("mid");
new MemberController().getMemberById(mid);
}else if ("getOrderById".equals(uri)){
String oid = req.getParameter("oid");
new OrderController().getOrderById(oid);
}else if ("getSystemById".equals(uri)){
new SystemController().logout();
}else {
resp.getWriter().write("404 not found");
}
}
}
MemberController
public class MemberController {
public void getMemberById(String mid){
System.out.println("獲取員工id");
}
}
OrderController
public class OrderController {
public void getOrderById(String oid){
System.out.println("獲取訂單id");
}
}
SystemController
public class SystemController {
public void logout(){
System.out.println("退出");
}
}
為了答謝大家關注和支持,這次給大家準備了限時領取福利:阿里面試題、百度面試題、滴滴面試題、華為面試題、京東面試題、美團面試題、騰訊面試題、頭條面試題、中興面試題,

還等什么小編推薦自己的linuxC/C++語言交流群:【1106675687】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群檔案里面,有需要的可以自行添加哦!前100名進群領取,額外贈送一份價值199的C/C++、linux資料包含(視頻教程、電子書、實戰專案及代碼),下面部分展示,


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247654.html
標籤:java
