1.委派模式简介

在常用的23种设计模式中其实面没有委派模式(delegate)的影子,但是在Spring中委派模式确实用的比较多的一种模式。

在spring中的体现:Spring MVC框架中的DispatcherServlet其实就用到了委派模式。

委派模式的作用: 基本作用就是负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果

2.委派模式的实例

先引用一张图来介绍委派模式,下图主要说明了 boss把任务给leader,而leader做了一个任务的分配和调度的工作,自己没有做工作,而是把具体工作交给具体的执行者去做。

下面直接给出实例:

执行的接口

/**
* @Project: spring
* @description: 执行的接口
* @author:
* @create: 2018-08-30 23:10
* @ModificationHistory who when What
**/
public interface IExcuter {
void excute(String command);
}

普通员工A

/**
* @Project: spring
* @description: 员工A执行某项命令
* @author:
* @create: 2018-08-30 23:10
* @ModificationHistory who when What
**/
public class ExcuterA implements IExcuter{ @Override
public void excute(String command) {
System.out.println("员工A 开始做"+command+"的工作");
}
}

普通员工B

/**
* @Project: spring
* @description: 员工B执行某项命令
* @author:
* @create: 2018-08-30 23:10
* @ModificationHistory who when What
**/
public class ExcuterB implements IExcuter{
@Override
public void excute(String command) {
System.out.println("员工B 开始做"+command+"的工作");
}
}

leader委派者

/**
* @Project: spring
* @description: leader 委派者 任务分发的作用
* @author:
* @create: 2018-08-30 23:11
* @ModificationHistory who when What
**/
public class Leader implements IExcuter { private Map<String,IExcuter> targets = new HashMap<String,IExcuter>();
public Leader() {
targets.put("加密",new ExcuterA());
targets.put("登录",new ExcuterB());
}
@Override
public void excute(String command) {
targets.get(command).excute(command);
}
}

boss类模拟调用测试

/**
* @Project: spring
* @description: boss 模拟客户执行任务
* @author:
* @create: 2018-08-30 23:13
* @ModificationHistory who when What
**/
public class Boss
{
public static void main(String[] args) {
Leader leader = new Leader();
//看上去好像是我们的项目经理在干活
//但实际干活的人是普通员工
//这就是典型,干活是我的,功劳是你的
leader.excute("登录");
leader.excute("加密");
}
}

测试结果为:

3.委派模式的实现mvc的简单实例

思考:
在springmvc 访问地址的urlController层配置的url是如何映射的
Controller层配置的url如何跟具体的方法映射的,参数又是如何绑定

猜测:
url的地址可以根据request得到访问url地址,配置的url地址可以根据配置注解得到,这两者的url匹配上了说明映射成功了,除了url是不够的,还需要一个中间对象保存了url和method以及controller对象的信息,可以把这个中年的映射对象放入容器中,然后根据传入的url从容器取出进行匹配,取出来之后就可以根据映射来完成方法的调用了。

下面就简单实现一个mvc调用的例子
模拟controller层

/**
* @Project: spring
* @description: 模拟controller层
* @author:
* @create: 2018-09-03 22:20
* @ModificationHistory who when What
**/
public class MemberAction { public void getMemberById(String mid){ }
}

模拟serlvert得到的请求如何转发,交给具体的controller处理的

/**
* @Project: spring
* @description: selvelt的任务分发者 ,主要完成url的映射和调用
* @author: sunkang
* @create: 2018-09-03 22:21
* @ModificationHistory who when What
**/
public class SelvletDispatcher {
//这里也可以用map 对象来保存Hanlder对象
private List<Handler> handlerMapping = new ArrayList<Handler>(); public SelvletDispatcher() {
//简单实现一个controller的映射
try {
Class clazz = MemberAction.class; handlerMapping.add(new Handler()
.setController(clazz.newInstance())
.setMethod(clazz.getMethod("getMemberById",new Class[]{String.class}))
.setUrl("/web/getMemberById.json")
);
} catch (Exception e) {
e.printStackTrace();
}
} private void doService(HttpServletRequest request, HttpServletResponse response){
doDispatch(request,response);
} /**
* 请求的分发工作
* @param request
* @param response
*/
private void doDispatch(HttpServletRequest request, HttpServletResponse response) {
//1.获取用户请求的url
String uri = request.getRequestURI();
Handler handler =null; ////2、根据uri 去handlerMapping找到对应的hanler
for(Handler h :handlerMapping){
if(uri.equals(h.getUrl())){
handler = h;
break;
}
}
//3.将具体的任务分发给Method(通过反射去调用其对应的方法)
Object obj = null;
try {
obj = handler.getMethod().invoke(handler.getController(),request.getParameter("mid"));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//4、获取到Method执行的结果,通过Response返回出去
// response.getWriter().write(); }
/**
* 具体的hanlder对象
*/
class Handler{
//controller对象
private Object controller;
//controller对象映射的方法
private String url;
//ulr对应的方法
private Method method; public Object getController() {
return controller;
} public Handler setController(Object controller) {
this.controller = controller;
return this;
} public String getUrl() {
return url;
} public Handler setUrl(String url) {
this.url = url;
return this;
} public Method getMethod() {
return method;
} public Handler setMethod(Method method) {
this.method = method;
return this;
}
}
}

spring常用模式--委派模式的更多相关文章

  1. 【Spring源码解析】—— 委派模式的理解和使用

    一.什么是委派模式 委派模式,是指什么呢?从字面含义理解,委派就是委托安排的意思,委派模式就是在做具体某件事情的过程中,交给其他人来做,这个事件就是在我的完整链路上的一部分,但是复杂度较高的情况下或者 ...

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

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

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

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

  4. 设计模式之委派模式,大名鼎鼎的Spring都在用

    什么是委派模式 虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式. "委派"字面意思就是指派一件事情给某人.类比到生活中的场景,比如项目leader指 ...

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

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

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

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

  7. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  8. 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式

    Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...

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

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

随机推荐

  1. 爬虫必备的web知识

    爬虫定义.分类和流程 爬虫的定义: 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序.爬虫就是模拟浏览器的行为,越像越好 ...

  2. Thymeleaf整合到Spring Security,标签sec不起作用

    将 pom 文件中的 thymeleaf-extras-springsecurity4 依赖改成  thymeleaf-extras-springsecurity5 <dependency> ...

  3. Kinect for Windows SDK开发入门(二):基础知识 上

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/03/31/KinectSDK_Application_Fundamentals_Part1.htm ...

  4. Python break, continue, pass 语句

    今天心情好好,来record一下,continue break pass 语句 1.break 与 continue break 语句可以跳出 for 和 while 的循环体.如果你从 for 或 ...

  5. NLP学习(3)---Bert模型

    一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...

  6. Python 多版本管理利器 pythonbrew

    在$HOME目录中管理python安装 简介 pythonbrew是受 perlbrew 和 rvm 启发,在用户的$HOME目录中进行python构建和安装自动化的项目. 另一衍生版本 : pyth ...

  7. 遥想大肠包小肠----python装饰器乱弹

    说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语 ...

  8. Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

  9. activemq的配置与结合spring使用

    其实无论在win下还是在linux下,都可以运行得很爽 下载安装包地址: http://www.apache.org/dyn/closer.cgi?path=/activemq/5.12.1/apac ...

  10. React顶层API

    1.React.Children相关 1. React.Children.map(props.children, mapFunc) 1)该方法用于在props.children不透明的情况下,安全的遍 ...