委派模式的定义及应用场景
委派模式不属于 GOF23 种设计模式中。委派模式(Delegate Pattern)的基本作用就是负责任务的调用和分配任务,跟代理模式很像(都会调用一个被代理对象/被委派对象去完成操作),可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重对被代理对象的增强和保护,而委派模式注重分工明确(自己不做让指定的人去做指定的事)。委派模式的好处就是降低把逻辑下沉到各个被委派对象中 便于维护扩展。委派模式在 Spring 中应用非常多,常用的 DispatcherServlet 其实就是用到了委派模式。登录请求会委派登录Controller去处理,支付请求会委派支付Controller去完成等等。下边我们来模拟实现这个
增加 PayController 类

public class PayController {
//执行业务方法
public void excute(HttpServletRequest req, HttpServletResponse res){
System.out.println("==============执行支付操作");
try {
PrintWriter out = res.getWriter();
out.write("pay complete");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

LoginController 类

public class LoginController {
//执行业务方法
public static void excute(HttpServletRequest req, HttpServletResponse res){
System.out.println("==============执行登录操作");
try {
PrintWriter out = res.getWriter();
out.write("login complete");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

DispatchServlet 类

public class DispatchServlet extends HttpServlet {
//根据请求路径 分发给指定 Controller 处理
private void doDidpatch(HttpServletRequest req, HttpServletResponse res){
String uri=req.getRequestURI();
System.out.println("=============请求路径:"+uri+"=="+req.getRequestURL());
if("/designpattern/pay".equals(uri)){
new PayController().excute(req,res);
}else if("/designpattern/login".equals(uri)){
new LoginController().excute(req,res);
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doDidpatch(req, resp);
}
}

web.xml中配置

<servlet>
<servlet-name>dispatchServlet</servlet-name>
<servlet-class>com.test.delegate.DispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatchServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

启动工程,访问login 路径 执行 LoginController中的逻辑

设计模式-委派模式_delegate pattern


访问pay路径 执行 PayController 中的逻辑

设计模式-委派模式_delegate pattern_02

在 Spring 源码中,只要以 Delegate 结尾的都是实现了委派模式。例如:BeanDefinitionParserDelegate 根据不同类型委派不同的逻辑解析 BeanDefinition