设计模式之委派模式,大名鼎鼎的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 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
随机推荐
- 新iPhone又要提价,苹果靠什么基业长青?
在股神巴菲特一番煽情言论之后,苹果股价再创新高,达到187.67美元,总市值约为9450亿美元,正大踏步向着1万亿美元市值的目标前进,这是一条科技.经济.财经.社会等领域的头条新闻,遭到全球各界人士的 ...
- php防止post数据刷新重复刷新。后退 等重复提交?
目前测试最好的办法:同步令牌(Token)机制来解决Web应用中重复提交的问题.还在研究中,稍后带来
- GUI-猜字游戏
# 设计思想先定义输入,输入,然后设计逻辑 # GUI from tkinter # 逻辑层 # 设计GUI(用户界面) from tkinter import * import tkinter.si ...
- 搭建harbor企业级私有registry
主机环境要求 硬件Hardware Resource Capacity Description CPU minimal 2 CPU 4 CPU is prefered Mem minimal 4GB ...
- netty源码分析(十八)Netty底层架构系统总结与应用实践
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...
- SVN图标含义说明
最经都在用Svn,对他上面的很多状态图标不是很理解,看了看它的帮助文档,说的很清楚,特地截张图. Svn不同状态图标及说明 - 简单 - 简单 Normal A fresh checked ...
- 解决sendmail发送邮件慢的问题
sendmail默认会先监听本机的邮件服务,如果本机邮件服务访问不了,在访问其他的邮件服务器 自己测试将本机主机名(通过hostname命令查看)从/etc/hosts中删除,发送邮件的速度就非常快了 ...
- openpyxl(python操作Excel)
一.安装 >>> pip install openpyxl import openpyxl 二.常用操作 1.创建与保存一个工作簿 wb = openpyxl.Workbook() ...
- scrapy爬虫-代理IP中间件
class ProxyDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not de ...
- 一篇文章带您读懂Map集合(源码分析)
今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...