Spring中常见的设计模式——委派模式
一、委派模式的定义及应用场景
委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式在Spring中的应用很多,比如:DispatcherServlet。用现实中的案例就是:老板给项目经理下达任务,项目经理再分配任务给员工,员工完成任务后,再由项目经理向老板汇报。
创建IEmployee员工接口:
- public interface IEmployee {
- void doing(String command);
- }
创建员工A,B:
- public class EmployeeA implements IEmployee {
- @Override
- public void doing(String command) {
- System.out.println("I'm A ,我在做" + command);
- }
- }
- public class EmployeeB implements IEmployee {
- @Override
- public void doing(String command) {
- System.out.println("I'm B ,我在做" + command);
- }
- }
创建项目经理:
- public class Leader implements IEmployee {
- private Map<String, IEmployee> targets = new HashMap<>();
- public Leader() {
- targets.put("加密", new EmployeeA());
- targets.put("登录", new EmployeeB());
- }
- //项目经理自己不干活
- @Override
- public void doing(String command) {
- targets.get(command).doing(command);
- }
- }
创建老板:
- public class Boss {
- public void command(String command, Leader leader) {
- leader.doing(command);
- }
- }
创建测试类:
- public class DelegateTest {
- public static void main(String[] args) {
- new Boss().command("登录", new Leader());
- }
- }
委派模式注重的是结果,代理模式注重的是过程。
委派模式注重内部的灵活和可复用性,策略模式注重可扩展性(外部扩展性)。
委派模式的核心是分发、调度、派遣,委派模式是静态代理和策略模式的一种特殊组合。
二、委派模式在源码中的体现
来看一下Spring MVC中的DispatherServlet是如何实现委派模式的。先创建两个Controller:
- @RestController
- @RequestMapping("/order")
- public class OrderController {
- @RequestMapping(value = "/getOrderById", method = RequestMethod.POST)
- public void getOrderById(String mid) {
- }
- }
- @RestController
- @RequestMapping("/member")
- public class MemberController {
- @RequestMapping(value = "/getMemberById", method = RequestMethod.POST)
- public void getMemberById(String mid){
- }
- }
分发任务,相当于项目经理:
- public class DispatcherServlet extends HttpServlet {
- private void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
- String uri = request.getRequestURI();
- String mid = request.getParameter("mid");
- if ("/member/getMemberId".equals(uri)) {
- new MemberController().getMemberById(mid);
- } else if ("/order/getOrderById".equals(uri)) {
- new OrderController().getOrderById(mid);
- } else {
- response.getWriter().write("404 Not Found!");
- }
- }
- @Override
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- try {
- doDispatch(request, response);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
这个简单的委派模式应用就实现了,在Spring中还有很多用到委派模式,在源码中以Delegate结尾的地方就是实现了委派模式,例如:BeanDefinitionParserDelegate根据不同逻辑委派不同的逻辑解析BeanDefinition.
Spring中常见的设计模式——委派模式的更多相关文章
- Spring中常见的设计模式——策略模式
策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...
- Spring中常见的设计模式——代理模式
一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...
- Spring中常见的设计模式——工厂模式
一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...
- Spring中常见的设计模式——原型模式
1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...
- Spring中常见的设计模式——模板模式
一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...
- Spring中常见的设计模式——适配器模式
一.适配器模式的应用场景 适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期待的另一个接口,使原本接口不兼容的类可以一起工作,属于构造设计模式. 适配器适用于以下几种业务场景: ...
- 设计模式:JDK和Spring中常见的设计模式
设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...
- Spring中常见的设计模式——单例模式
一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...
- spring 中常用的设计模式
一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...
随机推荐
- Spring Boot整合MyBatis(非注解版)
Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...
- 快捷键 导入命名空间shift +alt
- Netty学习——基于netty实现简单的客户端聊天小程序
Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...
- 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...
- MySQL的存储(一、连接数据库)
准备工作: 确保安装MySql 安装PyMySQL库 连接数据库: 这里首先尝试连接下数据库,假设当前MySQL运行在本地,用户名为root,密码为123456,运行端口为3306. 通过PyMySQ ...
- Mysql基础01-语法
数据库 数据的存储:将数据放到表中,表再放到库中. 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己.表名具有唯一性. 表由列组成,我们也称为字段.每个字段描述了它所含有的数据的意义表由列组 ...
- Rest微服务案例
数据库 数据库名称为Product; 创建api子工程,项目名为springcloud_api Product实体类 public class Product implements Serializa ...
- [TimLinux] django 下载功能中文文件名问题
from django.utils.encoding import escape_uri_pathfrom django.http import HttpResponse def download(r ...
- Orleans 序列化遇到的坑
真的是巨坑 搞明白问题的我简直无法用言语来描述我的心情 先上架构图 理想中的架构 服务随便上 网关只负责分发 然后跟随官方教程写遇到了序列化问题 以前有经验,不慌,以前稀里糊涂就搞定了. 再然后遇到一 ...
- 如何关注flink的maillist,参与贡献
对一些开源的中间件 大家可能都很热爱,如何参与其中呢,很多人却感觉是一件很遥远的事情, 最近一时兴起,迈出这一步,我关注一下也没啥问题 以下对flink的关注的一些步骤,(详细的可以参考官网步骤,ht ...