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 委派模 ...
随机推荐
- NSSearchPathForDirectoriesInDomains用法
iPhone会为每一个应用程序生成一个私有目录,这个目录位于: /Users/sundfsun2009/Library/Application Support/iPhone Simulator/Use ...
- ThinkPHP 中 where条件 or,and 同时使用
('a'=1 and 'b'=2) or ('c'=3 and 'd'=4) and 'e'=5 $where_1['a'] = 1; $where_1['b'] = 2; $where_2['c'] ...
- WPF最简单的分页控件
背景:最近在写项目的时候需要写一个简单的分页功能,因项目需要,没有改为MVVM模式,只需要在后台实现 1.呈现效果如下: 接下来就来上代码,看看怎么实现的 1.界面代码 <StackPanel ...
- Java基础面试相关
面试相关的问题(下) 四 Linux高级_ 1.Linux机器 变慢,怎么查看? (1)整机的性能 主要查看的是CPU和内存 先查看整机的top,使用命令 top 虚拟机 使用1可以查看哪个核被占用过 ...
- 小程序 - 简单实现mixin功能
前言 在业务中有没有一个场景:多个页面需要用到一样的 data 和 method,或者生命周期都需要执行同样的操作.我们在每个页面都写上重复的代码,一但功能修改就要更新多个页面,在后期维护起来会很麻烦 ...
- Python核心笔记:在python文件中如何调用其它python脚本文件,你肯定不会
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:zhujuyu 笔者在自学python的时候遇到了这样一个练习题:将 ...
- iSensor APP 之 摄像头调试 OV3640 OV2640 MT9d112 ov5642
iSensor APP 之 摄像头调试 OV3640 OV2640 MT9d112 iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l OV7670.OV7725.O ...
- Day 10 面向对象基础
目录 面对过程编程 面向对象编程 类 定义类 对象 定义对象 定制对象独有特征 面对过程编程 分析解决问题所需要的步骤, 用函数将这些步骤一步一步实现, 使用的时候一个个调用就可以了 优点: 复杂的问 ...
- 【重温基础】17.WebAPI介绍
本文是 重温基础 系列文章的第十七篇. 今日感受:挑战. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 [重温基础 ...
- 一次使用pip后的总结
pip 常用命令及搭配操作 一 .当安装了多个版本python的时候,表示用pythonx 的pip 进行: 1.pythonx -m pip install + 包名 装 包 2.pythonx - ...