学习目标:精简程序逻辑,提升代码的可读性。

内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群。

委派模式定义:

  • 委派模式(Delegate Pattern)的基本作用是负责任务的调度和分配任务,跟代理模式很像,可以看作是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。
  • 不属于GOF 23中设计模式之一
  • 属于行为型模式

常见应用场景案例:

  • DispatcherServlet
  • 类名以Delegate结尾的
  • 包含Dispatcher的一般都是委派模式
  • Spring框架IOC中的BeanDefinitionParserDelegate:Spring提供多种方式(java、xml、注解)配置bean,该类负责分发处理,注入的bean信息最终会被加载为一个BeanDefition对象(描述对象信息)

应用场景:解决多任务,又不希望把这些任务或者具体的实现让用户知道(不让用户直接交互),创建一个中间类,实现全权代理,达到对用户来说只有一个入口的目的。

简单代码案例

例子:老板需要安排任务给员工,但是又不能直接让老板去了解每个员工的擅长职能,就可以创建一个中间的经理职位负责了解职员的特长,分发任务。

boss类

/**
* @ClassName Boss
* @Author 周聪
* @Date 2021/1/9 15:48
* @Version 1.0
* @Description 老板发布命令
*/
public class Boss { /**
* 发任务
* @param command
* @param leader
*/
public void command(String command,Leader leader){
leader.doing(command);
}
}

经理类

/**
* @ClassName Leader
* @Author 周聪
* @Date 2021/1/9 16:04
* @Version 1.0
* @Description 项目经理
*/
public class Leader {
// 预先知道每个员工的特长、特征,分发任务
private Map<String,IEmployee> register = new HashMap<String,IEmployee>(); public Leader(){
register.put("加密",new EmployeeA());
register.put("架构",new EmployeeB());
} public void doing(String command){
// 交给指定的员工去做
register.get(command).doing(command);
}
}

员工接口

/**
* @ClassName IEmployee
* @Author 周聪
* @Date 2021/1/9 16:05
* @Version 1.0
* @Description 员工接口
*/
public interface IEmployee { /**
* 做事
* @param command
*/
void doing(String command);
}

员工A

/**
* @ClassName EmployeeA
* @Author 周聪
* @Date 2021/1/9 16:07
* @Version 1.0
* @Description 员工A
*/
public class EmployeeA implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工A,我开始干活了,我擅长加密,执行");
}
}

员工B

/**
* @ClassName EmployeeB
* @Author 周聪
* @Date 2021/1/9 16:09
* @Version 1.0
* @Description 员工B
*/
public class EmployeeB implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工B,我擅长架构,我开始干活了");
}
}

测试类

/**
* @ClassName DelegateTest
* @Author 周聪
* @Date 2021/1/9 16:18
* @Version 1.0
* @Description
*/
public class DelegateTest { public static void main(String[] args) {
new Boss().command("架构",new Leader());
}
}

SpringMvc的DispatcherServlet简单实现

DispatcherServlet是前端控制器委派模式的实现,提供Spring Web MVC的集中访问点,负责职责的分派

web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name> <servlet>
<servlet-name>delegateServlet</servlet-name>
<servlet-class>com.zc.pattern.delegate.mvc.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>delegateServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping> <!-- http://localhost:8080/getMemberById.do --> </web-app>

DispatcherServlet

package com.zc.pattern.delegate.mvc;

import com.zc.pattern.delegate.mvc.controllers.MemberController;
import com.zc.pattern.delegate.mvc.controllers.OrderController;
import com.zc.pattern.delegate.mvc.controllers.SystemController; import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* @ClassName DispatcherServlet
* @Author 周聪
* @Date 2021/1/9 16:31
* @Version 1.0
* @Description
*/
public class DispatcherServlet extends HttpServlet { @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 完成调度
doDispach(req,resp);
} private void doDispach(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String uri = req.getRequestURI();
if ("getMemberById".equals(uri)){
String mid = req.getParameter("mid");
new MemberController().getMemberById(mid);
}else if ("getOrderById".equals(uri)){
String oid = req.getParameter("oid");
new OrderController().getOrderById(oid);
}else if ("getSystemById".equals(uri)){
new SystemController().logout();
}else {
resp.getWriter().write("404 not found");
}
}
}

MemberController

/**
* @ClassName MemberController
* @Author 周聪
* @Date 2021/1/9 17:09
* @Version 1.0
* @Description
*/
public class MemberController { public void getMemberById(String mid){
System.out.println("获取员工id");
}
}
OrderController 
/**
* @ClassName OrderController
* @Author 周聪
* @Date 2021/1/9 17:10
* @Version 1.0
* @Description
*/
public class OrderController { public void getOrderById(String oid){
System.out.println("获取订单id");
}
}
SystemController 
/**
* @ClassName SystemController
* @Author 周聪
* @Date 2021/1/9 17:11
* @Version 1.0
* @Description
*/
public class SystemController { public void logout(){
System.out.println("退出");
}
}

以上对单例模式的介绍到此结束,欢迎批评指正。 附:源码地址

设计模式之委派模式(Delegate Pattern)深入浅出的更多相关文章

  1. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  2. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  3. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  6. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  7. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  8. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  9. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  10. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

随机推荐

  1. Fiddle抓包应用概述

    抓包: 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.重发.编辑.转存等操作,也用来检查网络安全.抓包也经常被用来进行数据截取等.说简单点就是抓取前端发送给服务器的数据 ...

  2. edusrc上海交通大学证书

  3. NOIP2020 浙江 游记

    day - ? 由于 CSP-S 的失利,感觉这一次 NOIP 的心态反而是非常的淡定,感觉反正已经炸过一次了,再炸一次好像也没什么,就抱着这样的心态去考试的. day 1 考试当天起晚了,到考场的时 ...

  4. EHCACHE实现登录错误次数账号锁定

    使用EHCACHE实现账号密码登录校验失败5次锁定10分钟 <?xml version="1.0" encoding="UTF-8"?> <e ...

  5. 8、Spring Cloud Zuul

    1.Zuul简介 Zuul包含了对请求的路由和过滤两个最主要的功能. 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础. 过滤器功能则负责对请求的处理过程进行干预,是实现请 ...

  6. NSMutableArray 的实现原理

    一.普通C语言的数组实现: 是开辟一段连续的内存空间,缺点:在插入下标为0的元素,会移动其他所有元素.添加,插入,删除同理.           当数组非常大时,这样很快会成为问题.     二.OC ...

  7. SpringBoot + SpringSecurity + Quartz + Layui实现系统权限控制和定时任务

    1. 简介   Spring Security是一个功能强大且易于扩展的安全框架,主要用于为Java程序提供用户认证(Authentication)和用户授权(Authorization)功能.    ...

  8. jmeter__问题记录,中文乱码问题(json参数化)

    这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...

  9. linux 配置本地yum源,配置国内yum源,配置epel源

    目录 一.配置本地yum源 二.配置国内yum源和epel源 一.配置本地yum源 1.挂载ISO镜像 mount -o loop /mnt/yum-iso/CentOS-7-x86_64-DVD-1 ...

  10. python干货:pop()函数的用法 [弹出删除功能]

    什么是弹出功能? 使用pop()删除元素是将元素从列表中删弹出,术语弹出(pop)源自这样的类比:列表像一个栈,而删除列表末尾的元素就相当于弹出栈顶元素 方法pop()删除并返回列表中的最后一个元素. ...