一、什么是委派模式
委派俩字很明确,谁叫谁去干什么事情,被称为委派,例如老板找给员工分配工作,这就是一种委派,只注重结果,而不注重过程。在设计模式中委派模式主要功能有任务的调度和任务的分配,是一种特殊情况下的静态代理的全权代理。
二、实际例子说明委派模式
老板--->部门经理--->员工 三者的关系:老板吩咐部门经理完成某件事情,部门经理根据每个人的特征,去分配工作,员工则执行经理分发的任务。这种场景就是现实生活中的委派模式,下面使用java代码完成这几者的关系。
三、代码如何实现
捋思路,三者有一个共同的特点,都是在做事情,此时我们可以写一个接口来让三者去实现接口,只是每个人做的事情不同而已。
/**
* 员工接口
*/
public interface DoThings{
/**
* 员工做事情的接口
* @param command
*/
void doing(String command);
}
/**
* 员工A
*/
public class EmployeeA implements DoThings{
@Override
public void doing(String command) {
System.out.println("我是员工A, 我能删库跑路,开始"+ command);
}
}
/**
* 员工B
*/
public class EmployeeB implements DoThings{
@Override
public void doing(String command) {
System.out.println("我是员工B, 我是杠精,开始"+ command);
}
}
/**
* 经理,也是员工,需要实现员工的事情
*/
public class Manager implements DoThings{
private Map<String, DoThings> register = new HashMap<>();
public Leader(){
register.put("杠", new EmployeeA());
register.put("删库跑路", new EmployeeB());
}
/**
* 项目经理不会自己去做事情,找员工干事情
*/
@Override
public void doing(String command) {
register.get(command).doing(command);
}
}
/**
* 老板
*/
public class Boss implements DoThings{
/**
* 老板需要告知经理干某件事情
* @param command 要干的事情
* @param m 哪一个经理
*/
@Override
public void doing(String command, Manager m){
m.doing(command);
}
}
public class DelegateTest {
public static void main(String[] args) {
new Boss().doing("杠", new Manager());
}
}
最后输出的结果:我是员工B, 我是杠精,开始杠
四、SpringMVC中DispatcherServlet是如何实现
1、DispatcherServlet是什么鬼?
在SpringMVC中,DispatcherServlet是一个浏览器路由地址集中访问点,他的作用是分发请求URL到具体的java方法。还有很多功能哈,这儿就实现路由分发功能。
2、写代码
创建controller控制器
/**
* 用户控制器
*/
public class UserController {
public String getNameById(String userId){
return "";
}
}
/**
* 登录控制器
*/
public class LoginController {
public void login(){
}
}
创建DispatcherServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 调度Servlet
*/
public class DispatcherServlet extends HttpServlet {
/**
* 重写Service方法实现调度
* @param req 请求
* @param resp 响应
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI();
String param = req.getParameter("para");
switch (uri){
case "getNameById" : new UserController().getNameById(param); break;
case "login" : new LoginController().login(); break;
default: break;
}
}
}
配置web.xml
<servlet>
<servlet-name>delegateServlet</servlet-name>
<servlet-class>com.example.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>
简单的委派模式就完成了,正确的理解委派模式,主要功能是完成对任务调度和分发功能