委派模式的定义及应用场景

委派模式(Delegate Pattern)不属于 GoF 23 种设计模式。委派模式的基本作用就是负责任务的调用和分配。委派模式在 Spring 中应用得非常多,大家常用的 DispatcherServlet 就用到了委派模式。

案例分析

现实生活中也常有委派的场景发生,例如老板(Boss)给项目经理(Leader)下达任务,项目经理会根据实际情况给每个员工派发任务,待员工把任务完成后,再由项目经理向老板汇报结果。我们用代码来模拟一下这个业务场景,先来看一下类图,如下图所示。

image.png

创建 IEmployee 员工接口:

  1. package com.yjw.demo.pattern.delegate2;
  2. public interface IEmployee {
  3. public void doing(String command);
  4. }

创建员工类 EmployeeA:

  1. package com.yjw.demo.pattern.delegate2;
  2. public class EmployeeA implements IEmployee {
  3. @Override
  4. public void doing(String command) {
  5. System.out.println("我是员工A,我现在开始干" + command + "工作");
  6. }
  7. }

创建员工类 EmployeeB:

  1. package com.yjw.demo.pattern.delegate2;
  2. public class EmployeeB implements IEmployee {
  3. @Override
  4. public void doing(String command) {
  5. System.out.println("我是员工B,我现在开始干" + command + "工作");
  6. }
  7. }

创建项目经理类 Leader:

  1. package com.yjw.demo.pattern.delegate2;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class Leader implements IEmployee {
  5. private Map<String, IEmployee> targets = new HashMap<>();
  6. public Leader() {
  7. targets.put("加密", new EmployeeA());
  8. targets.put("登录", new EmployeeA());
  9. }
  10. /**
  11. * 项目经理自己不干活,委派任务给对应的员工工作
  12. *
  13. * @param command
  14. */
  15. @Override
  16. public void doing(String command) {
  17. targets.get(command).doing(command);
  18. }
  19. }

创建 Boss 类下达命令:

  1. package com.yjw.demo.pattern.delegate2;
  2. public class Boss {
  3. public void command(String command, Leader leader) {
  4. leader.doing(command);
  5. }
  6. }

测试代码如下:

  1. package com.yjw.demo.pattern.delegate2;
  2. public class DelegateTest {
  3. public static void main(String[] args) {
  4. new Boss().command("登录", new Leader());
  5. }
  6. }

摘录:《Spring 5 核心原理与30个类手写实战》来自文艺界的Tom老师的书籍。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/dvi60g 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。