理解

首先委派模式不属于23种设计模式。

所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排。

更直白的表达就是,比如,我们想要盖一栋楼房,盖完之后我要刷漆,这些事情我自己肯定不能做,所以我这时候就会去找一个“包工头”来帮我完成这件事情,我只要告诉“包工头”我要盖房子、我要给房子刷漆等命令,其他的事情我不管,最终能够交付给我这个刷完漆房子就行。那么“包工头”也不可能自己来干的吧,这个时候他就会去找人,盖楼房的、刷漆的等等;然后叫他们来干这件事情,干完之后,交付给我一个刷完漆的房子即可。这个过程也就是委派模式的一个体现。

委派模式看上去和我们之前所说的“静态模式”非常相似,它可以说是一种特殊情况的静态代理的全权代理。但是也是有区别的,“静态代理”更注重的是过程,而“委派模式”只注重“结果”。

示例

我们现在就以上述中的例子,用代码来实现以下:

代码

先创建工人抽象类接口,他们都具有干活的功能 Worker

/*** 抽象 工人** @author EamonZzz* @date 2019-10-26 15:09*/
public interface Worker {/*** 干活** @param command 听命令干活*/void doWork(String command);
}

然后有一个工人A,砌砖砌的很好,很适合盖楼,WorkerA

/*** 工人A 他砌砖砌的很好,所以叫来盖楼比较好** @author EamonZzz* @date 2019-10-26 15:11*/
public class WorkerA implements Worker {@Overridepublic void doWork(String command) {System.out.println("我是工人A,包工头叫我 " + command);}
}

然后再来一个工人B,他是专业刷漆的 WorkerB

/*** 工人A 他砌砖砌的很好,所以叫来盖楼比较好** @author EamonZzz* @date 2019-10-26 15:11*/
public class WorkerA implements Worker {@Overridepublic void doWork(String command) {System.out.println("我是工人A,包工头叫我 " + command);}
}

再来找一个包工头,包工头也是一名工人,但是这个包工头主要是组织工人干活,Contractor

/*** 包工头(也是一名工人),承接项目,分配工人** @author EamonZzz* @date 2019-10-26 15:07*/
public class Contractor implements Worker {private Map<String,Worker> targets = new HashMap<String, Worker>();public Contractor() {targets.put("盖楼", new WorkerA());targets.put("刷漆", new WorkerB());}/*** 包工头不需要自己干活* @param command*/@Overridepublic void doWork(String command) {targets.get(command).doWork(command);}
}

最后就是有盖楼刷漆的需求的人,Boss

/*** 我,需要盖楼的人,给包工头下达盖楼、刷漆的命令** @author EamonZzz* @date 2019-10-26 15:06:09**/
public class Boss {/*** 下达 请求** @param command* @param contractor*/public void command(String command, Contractor contractor) {contractor.doWork(command);}
}

来看一下测试类:

/*** @author EamonZzz* @date 2019-10-26 15:23*/
public class BossTest {@Testpublic void test() {Boss boss = new Boss();boss.command("盖楼", new Contractor());boss.command("刷漆", new Contractor());}}

最终结果:

我是工人A,包工头叫我 盖楼
我是工人B,包工头叫我 刷漆

类图

这个过程就模拟完毕,Boss 给包工头下达命令说我要盖楼,然后包工头就去找能够盖楼的人去盖楼;然后下达命令说,我的楼房需要刷漆了,包工头就去找刷漆的人来干这件事情。

SpringMVC中使用委派模式的场景

SpringMVC中,也有委派模式的身影,比如我们最常见的 DispatcherServlet 它用来将我们前端URL传过来的请求,分发到相应的 Controller 控制器来处理请求,那么它是怎么来完成这一过程的呢?

其实结合上面的实例场景就不难分析出来原理。

总结

对于“委派模式”和“静态代理模式”的区别,在文章开头已经提到过,“静态代理”注重过程,代理类和被代理类都要去实现一个接口;而“委派模式”更注重结果,Boss不需要实现Worker 这个接口。就拿敲代码这个能力来说,“静态代理”的Boss类需要会敲代码,而“委派模式”中的Boss则不需要会敲代码。

源码地址:[https://github.com/eamonzzz/java-advanced/tree/...](eamonzzz/java-advanced)

代理模式 委派模式 策略模式_设计模式 - 委派模式相关推荐

  1. 反模式设计_设计模式:模式或反模式,这就是问题

    反模式设计 我最近遇到了Wiki页面" Anti-pattern" ,其中包含详尽的反模式列表. 其中一些对我来说很明显. 他们中的一些让我想了一下,其他的让我想了更多. 然后,我 ...

  2. android工厂模式源码,Android源码设计模式——工厂模式

    工厂模式也是为了构建一个新的对象,它是创建型模式的一种. Android源码设计模式--Build模式(应用:AlertDialog源码分析) 上述是之前的Build模式,也是创建型模式一种,不懂的小 ...

  3. 外观模式和代理模式的联系和区别_设计模式之代理模式

    代理模式 Proxy Intro 代理模式,给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间 ...

  4. 外观模式和代理模式的联系和区别_设计模式之代理设计模式

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 今天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到我们的程序中就是通过代理对象来控制某个具体对象某个方法的 ...

  5. 模板设计模式_设计模式-模板方法模式

    一.模板方法模式的定义 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计 ...

  6. java 工厂模式的写法_设计模式-工厂模式

    一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...

  7. java 管道设计_设计模式——管道模式

    管道(执行流)模型由Pipeline(管道)/ Valve(阀门)/ Context(上下文) 组成 概念 我们把特定的业务,比如订单业务中的临时订单.订单提交以及订单支付等,抽象成一组Pipelin ...

  8. 13. 星际争霸之php设计模式--正面模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  9. 12. 星际争霸之php设计模式--模板模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

最新文章

  1. 把握数据,驱动未来 | 清华大学大数据研究中心2020年RONG奖学金答辩会成功举办...
  2. 零售行业SAP项目 --- SAP顾问向大数据转型的契机
  3. AMD VS 英特尔:芯片制造实力似乎正在发生逆转!
  4. ORA-01078与LRM-00109报错解决
  5. 不是每个打工人都能享受 996 的福报
  6. 如何设置windows下xampp的phpMyAdmin外网访问?
  7. Mysql学习笔记(三)运算符和控制流函数
  8. ios 检测是否联网_秋招|阿里 iOS 五轮面经分享,已收到阿里的意向书
  9. 推荐 21 个顶级的 Vue UI 库
  10. 被女孩子冷落了,最适合看的20句话
  11. PTA c语言 统计单词的长度
  12. java怎么定义范围_java – Dagger自定义范围,怎么办?
  13. PHP 中获取文件名及路径
  14. 【Java编译】含package的类文件编译
  15. 资源---2020考研---考研经验(总结:踏踏实实跟着汤家凤老师)
  16. 人脸关键点检测的思考
  17. 腰围2尺1,2,3,4,5,6,7,8寸各自等于是多少厘米/英寸(对比表)
  18. c++计算一维数组中的最大元素
  19. 小心利用大家的爱国热情来传播Worm.Win32.AutoRun.dgk的网页
  20. 关于IPB帧与恒定比特率、动态比特率的详解

热门文章

  1. 京东金融品牌升级,为用户做精准决策,打造金融机构的“第二增长场景”
  2. 业界首发|云原生领域首本架构白皮书重磅发布
  3. 等你来战!“2020第三届上海交大-卫宁健康智慧医疗挑战赛”报名正式启动
  4. 10 倍高清不花!大麦端选座 SVG 渲染
  5. 这类程序员,钱包要鼓了!
  6. 5G 商用时,我们所处的智能城市会是什么样?
  7. AI 秒杀人类!OpenAI 击败 DOTA2 世界冠军 OG
  8. 惠普往事:全球最大的 PC 制造商炼成记!| 极客头条
  9. AI 芯片为何遭遇滑铁卢?
  10. 蚂蚁金服双 11 大促全面揭秘:百万支付、容器化和平台智能化