设计模式-委派模式

委派模式的定义及应用场景
委派模式不属于 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中配置

 
    dispatchServlet
    com.test.delegate.DispatchServlet
  
  
    dispatchServlet
    /*
  

启动工程,访问login 路径 执行 LoginController中的逻辑
设计模式-委派模式_第1张图片
访问pay路径 执行 PayController 中的逻辑
在这里插入图片描述

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

你可能感兴趣的:(设计模式,设计模式,委派模式,delegate,pattern)