设计模式之委派模式,大名鼎鼎的Spring都在用
什么是委派模式
虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式。
“委派”字面意思就是指派一件事情给某人。类比到生活中的场景,比如项目leader指派开发任务给下面的猿猿们。这听起来有点像静态代理,不过还是不一样的,你品,你细品!代理强调的是过程,主要是要在代理过程中加入一些动作的,而委派主要是分配和分发。
代码实现
我们先新建一个业务处理接口BusinessService
public interface BusinessService {
void doService();
}
新建两个实现类LoginService和OrderService
public class LoginService implements BusinessService{
public void doService() {
System.out.println("处理登录相关业务");
}
}
public class OrderService implements BusinessService{
public void doService() {
System.out.println("订单业务模块");
}
}
新建一个枚举类,表示不同的业务类型,这里假设就两个,login和order
public enum ServerType {
LOGIN,ORDER;
}
新建一个业务查找类,主要是用于根据不用的业务类型选择不同的业务组件提供服务。
public class BussinessLookup {
private OrderService orderService;
private LoginService loginService;
/**
* 查找对应的服务
* @param serverType
* @return
*/
public BusinessService getBusinessService(ServerType serverType){
if(serverType.equals(ServerType.LOGIN)){
return loginService;
}else{
return orderService;
}
}
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
接下来,关键的类来了,委派类。做的工作主要是分发。
public class BusinessDelegate {
private BussinessLookup bussinessLookup;
private BusinessService businessService;
private ServerType serverType;
public void setBussinessLookup(BussinessLookup bussinessLookup) {
this.bussinessLookup = bussinessLookup;
}
public void setServerType(ServerType serverType) {
this.serverType = serverType;
}
/**
* 委派方法,其实最终调用的是业务类的方法
*/
public void doTask(){
businessService = bussinessLookup.getBusinessService(serverType);
businessService.doService();
}
}
我们再来个客户端类,也就是请求类,它通过委派类完成工作。就是说我不需要知道在幕后到底是哪个业务组件在处理,我只需要给你请求,你帮我完成好任务就OK.。说明白点,委派类就是做了一层封装和抽象,不将业务处理的大量组件暴露给请求层或者说是视图层。
public class Client {
private BusinessDelegate businessDelegate;
public Client(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public void doTask(){
businessDelegate.doTask();
}
}
好了,我们写个Main测试一下。
public class AppMain {
public static void main(String[] args) {
BusinessDelegate businessDelegate = new BusinessDelegate();
BussinessLookup bussinessLookup = new BussinessLookup();
bussinessLookup.setLoginService(new LoginService());
bussinessLookup.setOrderService(new OrderService());
businessDelegate.setBussinessLookup(bussinessLookup);
businessDelegate.setServerType(ServerType.LOGIN);
Client client = new Client(businessDelegate);
client.doTask();
// businessDelegate.setServerType(ServerType.ORDER);
// client.doTask();
}
}
结果:
处理登录相关业务
在这里,非常有必要看下类图

在Spring源码中应用
在Spring源码中我们可以搜索一下,使用delegate关键词模糊查找下,但凡以Delegate结尾的都是委派模式的应用。
比如:BeanDefinitionParserDelegate、ConstructorDelegate、MultipartResolutionDelegate、TypeConverterDelegate等。
当然了,我们熟知的DispatcherServlet 虽然没带delegate,但也是委派模式的一种实现。
前端请求都统一走到DispatcherServlet 的doService()方法中,然后在doService()方法中调用doDispatch()方法,在doDispatch()方法中,会获取业务处理的handler,执行handle()方法处理请求。
doDispatch()方法核心源码截图

应用场景
- 当你要实现表现层和业务层之间的松耦合的时候。
- 当你想要编排多个服务之间的调用的时候。
- 当你想要再封装一层服务查找和调用时候
公众号:二营长的笔记
免费领资料:公众号内回复“二营长”
设计模式之委派模式,大名鼎鼎的Spring都在用的更多相关文章
- 大型Java进阶专题(七) 设计模式之委派模式与策略模式
前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...
- Java设计模式之委派模式(Dellegate/Dispather)
概述: 委派模式有点像代理模式又有点像策略模式. 区别在于代理模式注重过程,委派模式注重结果. 生活中也有很多委派模式的例子:例如公司老板给项目经理下达任务,将任务全权交给项目经理,有项目经理根据一定 ...
- 设计模式之委派模式(Delegate Pattern)深入浅出
学习目标:精简程序逻辑,提升代码的可读性. 内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群. 委派模式定义: 委派模式(Delegate Pattern)的基本作用是负责任务的调度 ...
- 设计模式_策略模式_在Spring中的应用
一.理论 在spring中经常有读取配置文件的需求,这里就会用到一个Spring提供的Resource接口 Resource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口.Resour ...
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- Spring中常见的设计模式——委派模式
一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...
- spring设计模式_代理模式
代理模式应该是Spring核心设计模式之一了 先说下代理模式特性: 1.有代理人和被代理人 2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做. 3.需要获取到被代理人的 ...
- Spring设计模式_策略模式/其他
策略模式特性 1.执行最终结果一样 2.执行过程和执行逻辑不一样 3.使用同一接口 达到目的就可以了 Git地址 https://github.com/wujiachengSH/WjcStrategy ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
随机推荐
- Jenkins+jmeter设置定时执行任务
1.准备好你的jmeter脚本 2.测试命令行下脚本执行 1)cd进入脚本目录 2)dir命令查看该目录下的脚本文件 3)jmeter -n -t test.jmx -l result.jtl 命令 ...
- 关于js中的比较时遇到的坑
关于JavaScript中比较遇到的坑 当你的要比较数字的大小但是你的数字确是字符串时,就会出错比如说: console.log('5' > '6') // fasle consloe.log( ...
- 吴裕雄--天生自然 R语言开发学习:聚类分析
#-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...
- 前端页面设计常见的30个CSS选择器
1. * --> 通配符选择器 * { margin: 0; padding: 0; } 星号符会选择页面每个元素.很多开发者用它把所有margin和padding归零.这当然是快捷测试 ...
- Java Annotation/Scope
1.在计算机编程语言Java中,什么是注释(Annotation)? 注释是一种可以添加到Java源代码的语法元数据或描述(注释不影响程序执行) 2.注释(Annotation)有什么作用? ( ...
- TensorFlow_Faster_RCNN中demo.py的运行(CPU Only)
GitHub项目地址,https://github.com/endernewton/tf-faster-rcnnTensorflow Faster RCNN for Object Detection. ...
- WiFi曝出安全漏洞几近“裸奔”:运营商能借机收割一波红利吗?
作为大众生活中不可或缺的基础架构,也是智能生活普及的推动性力量,运营商的重要性毋庸置疑.但无奈的是,一直以来运营商都似乎是站在了大众的"对立面".看似光鲜亮丽,但在壮观的 ...
- 前沿理论、反思创新、产学结合——你不能错过的WSDM 2016大会
第九届ACM网络搜索与数据挖掘国际会议(ACM International Conference on Web Search and Data Mining,简称WSDM)已于上周(2月22日-25日 ...
- flume install
flume install flume 安装 123456 [root@10 app][root@10 app]# mv apache-flume-1.7.0-bin /mnt/app/flume[r ...
- 如何在NLP领域第一次做成一件事
作者简介 周明,微软亚洲研究院首席研究员.ACL候任主席(president).中国计算机学会中文信息技术专委会主任.中国中文信息学会常务理事.哈工大.天津大学.南开大学.山东大学等多所学校博士导师. ...