什么是委派模式

虽然说委派模式不属于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()方法核心源码截图

应用场景

  1. 当你要实现表现层和业务层之间的松耦合的时候。
  2. 当你想要编排多个服务之间的调用的时候。
  3. 当你想要再封装一层服务查找和调用时候

公众号:二营长的笔记

免费领资料:公众号内回复“二营长”

设计模式之委派模式,大名鼎鼎的Spring都在用的更多相关文章

  1. 大型Java进阶专题(七) 设计模式之委派模式与策略模式

    前言 ​ 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  2. Java设计模式之委派模式(Dellegate/Dispather)

    概述: 委派模式有点像代理模式又有点像策略模式. 区别在于代理模式注重过程,委派模式注重结果. 生活中也有很多委派模式的例子:例如公司老板给项目经理下达任务,将任务全权交给项目经理,有项目经理根据一定 ...

  3. 设计模式之委派模式(Delegate Pattern)深入浅出

    学习目标:精简程序逻辑,提升代码的可读性. 内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群. 委派模式定义: 委派模式(Delegate Pattern)的基本作用是负责任务的调度 ...

  4. 设计模式_策略模式_在Spring中的应用

    一.理论 在spring中经常有读取配置文件的需求,这里就会用到一个Spring提供的Resource接口 Resource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口.Resour ...

  5. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  6. Spring中常见的设计模式——委派模式

    一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...

  7. spring设计模式_代理模式

    代理模式应该是Spring核心设计模式之一了 先说下代理模式特性: 1.有代理人和被代理人 2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做. 3.需要获取到被代理人的 ...

  8. Spring设计模式_策略模式/其他

    策略模式特性 1.执行最终结果一样 2.执行过程和执行逻辑不一样 3.使用同一接口 达到目的就可以了 Git地址 https://github.com/wujiachengSH/WjcStrategy ...

  9. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

随机推荐

  1. Python连接SQLServer2000

    http://www.pymssql.org/en/stable/pymssql_examples.html 实例 import pymssql # 获取连接 conn = pymssql.conne ...

  2. webservice入门程序学习中经验总结

    ***第一步:创建客户端服务 1)创建一个服务接口 2)创建一个实现类实现接口 3)创建一个方法开启服务 这三步注意点:::实现类上必须添加@WebService标签 :::发布服务的时候用到的函数是 ...

  3. Java IO: PipedOutputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedOutputStream可以往管道里写入读取字节流数据,代码如下: 01 Outp ...

  4. Java IO: 并发IO

    原文链接 作者: Jakob Jenkov 译者: 李璟 有时候你可能需要并发地处理输入和输出.换句话说,你可能有超过一个线程处理输入和产生输出.比如,你有一个程序需要处理磁盘上的大量文件,这个任务可 ...

  5. $random 函数用法

    $random函数调用时,返回一个32位的随机数,它是一个带符号的整形数.如下例: reg[23:0] rand; rand = $random % 60; //产生一个在 -59~59 范围的随机数 ...

  6. Tensorflow 错误集锦

    文章目录 参考文献 本文记录笔者在Tensorflow使用上的一些错误的集锦,方便后来人迅速查阅解决问题. 我是留白. 我是留白. CreateSession still waiting for re ...

  7. let和const区别

    let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const命令 const声明一个只读的常量.一旦声明,常量的值就不能改变.

  8. 在 macOS 上试用 Gentoo/Prefix

    前几天参加了许朋程主讲的Tunight,对Gentoo有了一定的了解,不过看到如此复杂的安装过程和长久的编译时间,又看看我的CPU,只能望而却步了.不过,有Gentoo/Prefix这个工具,使得我们 ...

  9. Atom配置(VIM党) · iuunhao

    为什么说是Vim党呢?首先我是一个深度的Vim用户,自己的电脑上基本上可以兼容Vim的插件都有,所有浏览器,所有编辑器都是Vim的操作方式,当然包括我现在书写的markdown的软件EME也是兼容的V ...

  10. 亚马逊,谷歌,Facebook,IBM和微软:为了AI,是的,我们在一起了

    美国时间9月28日,也就是几个小时前,亚马逊,谷歌,Facebook,IBM和微软宣布成立了一家非盈利组织:人工智能合作组织(Partnership on AI),目标是为人工智能的研究制定和提供范例 ...