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 委派模 ...
随机推荐
- webpack4分包方案
webpack4放弃了 commonsChunkPlugin,使用更方便灵活智能的 splitChunks 来做分包的操作. 下面有几个例子,并且我们假设所有的chunks大小至少为30kb(采用sp ...
- 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)
搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...
- Xcode编译引用Framework
需要两步配置 1.在xcode工程的search path下设置要引用的Framework所在路径 2.将Framewoek拖入工程中时 不要选择copy,而选择引用模式.
- HDU1846 Brave Game(巴什博弈)
十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻. 今天,大家选择 ...
- Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:崩坏的芝麻 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要 ...
- HtmlAgilityPack 获取节点的子节点
这个问题真的是好无语 var table = doc.DocumentNode.SelectSingleNode("//table[@class='ddd']"); var a = ...
- 【Git】本地分支
[Git]本地分支 转载:https://www.cnblogs.com/yangchongxing/p/10221382.html 目录 ============================== ...
- 【Python进阶】来谈谈几个常用的内置函数
匿名函数(lambda表达式) 在Python中,函数可以算的上是“一等公民”了,我们先回顾下函数的优点: 减少代码重复量 模块化代码 但是我们有没有想过,如果我们需要一个函数,比较简短,而且只需要使 ...
- POJ2182题解——线段树
POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...
- [ASP.NET Core 3框架揭秘] 文件系统[4]:程序集内嵌文件系统
一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以采用统一的编程方式来读取内嵌的资源文件,该类型定义在 "Microsoft.Ex ...