设计模式-委派模式

委派模式的定义及应用场景
委派模式不属于 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中的逻辑
在这里插入图片描述
访问pay路径 执行 PayController 中的逻辑
在这里插入图片描述

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值