一、委派模式的定义及应用场景

  委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式在Spring中的应用很多,比如:DispatcherServlet。用现实中的案例就是:老板给项目经理下达任务,项目经理再分配任务给员工,员工完成任务后,再由项目经理向老板汇报。

  创建IEmployee员工接口:

  1. public interface IEmployee {
  2. void doing(String command);
  3. }

  创建员工A,B:

  1. public class EmployeeA implements IEmployee {
  2. @Override
  3. public void doing(String command) {
  4. System.out.println("I'm A ,我在做" + command);
  5. }
  6. }
  7. public class EmployeeB implements IEmployee {
  8. @Override
  9. public void doing(String command) {
  10. System.out.println("I'm B ,我在做" + command);
  11. }
  12. }

  创建项目经理:

  1. public class Leader implements IEmployee {
  2.  
  3. private Map<String, IEmployee> targets = new HashMap<>();
  4.  
  5. public Leader() {
  6. targets.put("加密", new EmployeeA());
  7. targets.put("登录", new EmployeeB());
  8. }
  9.  
  10. //项目经理自己不干活
  11. @Override
  12. public void doing(String command) {
  13. targets.get(command).doing(command);
  14. }
  15. }

  创建老板:

  1. public class Boss {
  2. public void command(String command, Leader leader) {
  3. leader.doing(command);
  4. }
  5. }

  创建测试类:

  1. public class DelegateTest {
  2. public static void main(String[] args) {
  3. new Boss().command("登录", new Leader());
  4. }
  5. }

  委派模式注重的是结果,代理模式注重的是过程。

  委派模式注重内部的灵活和可复用性,策略模式注重可扩展性(外部扩展性)。

  委派模式的核心是分发、调度、派遣,委派模式是静态代理和策略模式的一种特殊组合。

二、委派模式在源码中的体现

  来看一下Spring MVC中的DispatherServlet是如何实现委派模式的。先创建两个Controller:

  1. @RestController
  2. @RequestMapping("/order")
  3. public class OrderController {
  4.  
  5. @RequestMapping(value = "/getOrderById", method = RequestMethod.POST)
  6. public void getOrderById(String mid) {
  7.  
  8. }
  9. }
  1. @RestController
  2. @RequestMapping("/member")
  3. public class MemberController {
  4.  
  5. @RequestMapping(value = "/getMemberById", method = RequestMethod.POST)
  6. public void getMemberById(String mid){
  7.  
  8. }
  9. }

  分发任务,相当于项目经理:

  1. public class DispatcherServlet extends HttpServlet {
  2.  
  3. private void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. String uri = request.getRequestURI();
  5.  
  6. String mid = request.getParameter("mid");
  7.  
  8. if ("/member/getMemberId".equals(uri)) {
  9. new MemberController().getMemberById(mid);
  10. } else if ("/order/getOrderById".equals(uri)) {
  11. new OrderController().getOrderById(mid);
  12. } else {
  13. response.getWriter().write("404 Not Found!");
  14. }
  15. }
  16.  
  17. @Override
  18. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  19. try {
  20. doDispatch(request, response);
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

  这个简单的委派模式应用就实现了,在Spring中还有很多用到委派模式,在源码中以Delegate结尾的地方就是实现了委派模式,例如:BeanDefinitionParserDelegate根据不同逻辑委派不同的逻辑解析BeanDefinition.

Spring中常见的设计模式——委派模式的更多相关文章

  1. Spring中常见的设计模式——策略模式

    策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...

  2. Spring中常见的设计模式——代理模式

    一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...

  3. Spring中常见的设计模式——工厂模式

    一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...

  4. Spring中常见的设计模式——原型模式

    1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...

  5. Spring中常见的设计模式——模板模式

    一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...

  6. Spring中常见的设计模式——适配器模式

    一.适配器模式的应用场景 适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期待的另一个接口,使原本接口不兼容的类可以一起工作,属于构造设计模式. 适配器适用于以下几种业务场景: ...

  7. 设计模式:JDK和Spring中常见的设计模式

    设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...

  8. Spring中常见的设计模式——单例模式

    一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...

  9. spring 中常用的设计模式

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

随机推荐

  1. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  2. 快捷键 导入命名空间shift +alt

  3. Netty学习——基于netty实现简单的客户端聊天小程序

    Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...

  4. 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...

  5. MySQL的存储(一、连接数据库)

    准备工作: 确保安装MySql 安装PyMySQL库 连接数据库: 这里首先尝试连接下数据库,假设当前MySQL运行在本地,用户名为root,密码为123456,运行端口为3306. 通过PyMySQ ...

  6. Mysql基础01-语法

    数据库 数据的存储:将数据放到表中,表再放到库中. 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己.表名具有唯一性. 表由列组成,我们也称为字段.每个字段描述了它所含有的数据的意义表由列组 ...

  7. Rest微服务案例

    数据库 数据库名称为Product; 创建api子工程,项目名为springcloud_api Product实体类 public class Product implements Serializa ...

  8. [TimLinux] django 下载功能中文文件名问题

    from django.utils.encoding import escape_uri_pathfrom django.http import HttpResponse def download(r ...

  9. Orleans 序列化遇到的坑

    真的是巨坑 搞明白问题的我简直无法用言语来描述我的心情 先上架构图 理想中的架构 服务随便上 网关只负责分发 然后跟随官方教程写遇到了序列化问题 以前有经验,不慌,以前稀里糊涂就搞定了. 再然后遇到一 ...

  10. 如何关注flink的maillist,参与贡献

    对一些开源的中间件 大家可能都很热爱,如何参与其中呢,很多人却感觉是一件很遥远的事情, 最近一时兴起,迈出这一步,我关注一下也没啥问题 以下对flink的关注的一些步骤,(详细的可以参考官网步骤,ht ...