type
status
date
slug
summary
tags
category
icon
password
1、委派模式是什么
委派模式的基本作用是负责任务的调度和分配。委派对象本身不知道如何处理一个任务或一个请求,把请求交给其他对象来处理。
委托可以看做是一种特殊情况下的静态代理的全权代理。但是代理模式强调访问控制,对外隐藏实现细节;而委派模式强调任务分配。
委派模式 是一种行为型模式,但是不属于(GOF)23种设计模式。
2、委派模式的实现
委派模式有三个主要角色:
Task
(抽象任务): 定义一个抽象接口, 它有多个实现类。
ConcreteTask
(具体任务执行者、被委派者): 实现Task
接口,真正执行任务的角色。
Delegate
(委派者): 实现Task
接口,负责在各个具体角色实例之间做出决策,判断并调用 ConcreteTask 的方法。
有的书上说Delegate
可以不实现Task
接口 。

创建 IEmployee员工接口
创建员工 EmployeeA 类
创建员工 Employees 类
创建项目经理 Leader 类
创建 Boss 类下达命令,让 Leader 去完成任务,并不关心完成任务的细节。
测试代码:
运行结果:
3、委派模式的应用
在 Spring 大量应用了委派模式,以
Delegate
,Dispatcher
结尾的类都使用了委派模式。3.1 双亲委派模型
JDK 中有一个典型的委派 ,众所周知 JVM 在加载类是用的双亲委派模型 ,这又是什么呢?—类加载器在加载类时 , 先把这个请求委派给自己的父类加载器去执行 ,如果父类加载器还存在父类加载器 , 就继续向上委派,直到顶层的启动类加载器。如果父类加载器能够完成类加载,就成功返回,如果父类 加载器无法完成加载,那么子加载器才会尝试自己去加载。从定义中可以看到双亲加载模型一个类加载器加载类时 , 首先不是自己加载 ,而是委派给父加载器。下面我们来看看 loadClass()方法的源码 ,此方法在 Classloader 中。在这个类里就定义了一个双亲,用于下面的类加载。
3.2 Spring loC 调用 doRegisterBeanDefinitions()
下面来看一下委派模式在Spring 中的应用在Spring loC中 在调用 doRegisterBeanDefinitions() 方法时即 BeanDefinition进行注册的过程中,会设置 BeanDefinitionParserDelegate 的 Delegate对象传给 this.delegate 并将这个对象作为一个参数传给 :parseBeanDefinitions(root, this.delegate) 中 ,然后主要的解析的工作就是通过 delegate 作为主要角色来完成的, 可以看到下方代码 :
其中最终能够走到 bean 注册部分的是 ,会进入到 parseDefault Element(ele, delegate) 中,然后 针对不同的节点类型针对 bean 的节点进行真正的主册操作而在这个过程中,delegate 会对 element 进行 parseBeanDefinitionElement , 得到了一个 BeanDefinitionHolder 类型的对象,之后通过这个对象完成真正的注册到 Factory 的操作。
3.3 SpringMVC 的 DispatcherServlet
写一个简化版的 ServletDispatcher。
- 前端请求都统一走到 DispatcherServlet 的
doService()
方法中,在doService()
方法中调用doDispatch()
方法
- 在
doDispatch()
方法中,进行复杂的任务进行分解,分发执行并通过一个委派者角色,会获取业务处理的 handler,然后使用该 handler 处理请求。
- handler 返回处理结果,把结果返回给前端。
- Author:mcbilla
- URL:http://mcbilla.com/article/1e385c7d-7c1d-8087-ac46-ea8e91632184
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts