经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式 - 委派模式
来源:cnblogs  作者:EamonZzz  时间:2019/10/28 11:20:35  对本文有异议

理解

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

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

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

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

示例

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

代码

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

  1. /**
  2. * 抽象 工人
  3. *
  4. * @author EamonZzz
  5. * @date 2019-10-26 15:09
  6. */
  7. public interface Worker {
  8. /**
  9. * 干活
  10. *
  11. * @param command 听命令干活
  12. */
  13. void doWork(String command);
  14. }

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

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

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

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

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

  1. /**
  2. * 包工头(也是一名工人),承接项目,分配工人
  3. *
  4. * @author EamonZzz
  5. * @date 2019-10-26 15:07
  6. */
  7. public class Contractor implements Worker {
  8. private Map<String,Worker> targets = new HashMap<String, Worker>();
  9. public Contractor() {
  10. targets.put("盖楼", new WorkerA());
  11. targets.put("刷漆", new WorkerB());
  12. }
  13. /**
  14. * 包工头不需要自己干活
  15. * @param command
  16. */
  17. @Override
  18. public void doWork(String command) {
  19. targets.get(command).doWork(command);
  20. }
  21. }

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

  1. /**
  2. * 我,需要盖楼的人,给包工头下达盖楼、刷漆的命令
  3. *
  4. * @author EamonZzz
  5. * @date 2019-10-26 15:06:09
  6. **/
  7. public class Boss {
  8. /**
  9. * 下达 请求
  10. *
  11. * @param command
  12. * @param contractor
  13. */
  14. public void command(String command, Contractor contractor) {
  15. contractor.doWork(command);
  16. }
  17. }

来看一下测试类:

  1. /**
  2. * @author EamonZzz
  3. * @date 2019-10-26 15:23
  4. */
  5. public class BossTest {
  6. @Test
  7. public void test() {
  8. Boss boss = new Boss();
  9. boss.command("盖楼", new Contractor());
  10. boss.command("刷漆", new Contractor());
  11. }
  12. }

最终结果:

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

类图

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

SpringMVC中使用委派模式的场景

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

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


总结

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

原文链接:http://www.cnblogs.com/eamonzzz/p/11750562.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号