设计模式之行为型设计模式-委派模式

1. 模式简介

负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果;属于行为型设计模式不属于23种设计模式

2. 示例代码

  • 业务执行者(Worker)的具体实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* <p>
* 工人接口
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:17
*/
public interface Worker {
/**
* 做事情
*
* @param thing 任务
*/
void doing(String thing);
}

/**
* <p>
* 厨师工
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:19
*/
public class ChefWorker implements Worker {
/**
* 做事情
*
* @param thing 任务
*/
@Override
public void doing(String thing) {
System.out.println("我是厨师,我接到任务,需要做美食。");
}
}

/**
* <p>
* 缝纫工
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:19
*/
public class TailorWorker implements Worker {
/**
* 做事情
*
* @param thing 任务
*/
@Override
public void doing(String thing) {
System.out.println("我是缝纫工,我接到任务,需要做衣服。");
}
}
  • 任务派发者(Leader)的具体实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* <p>
* 组长
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:21
*/
public class Leader implements Worker {
private static Map<String, Worker> OFFICE = new HashMap<>();

public Leader() {
OFFICE.put("cooking", new ChefWorker());
OFFICE.put("sewing", new TailorWorker());
}

/**
* 做事情
*
* @param thing 任务
*/
@Override
public void doing(String thing) {
System.out.println("我是组长,领导需要: " + thing + ",我来安排任务: " + thing);
if (OFFICE.containsKey(thing)) {
OFFICE.get(thing).doing(thing);
} else {
System.err.println("目前办公室没有对应职位的工人");
}
}
}
  • 大领导(Boss)的具体实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* <p>
* 领导
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:26
*/
public class Boss {
/**
* 下命令
*
* @param thing 需要处理的事情
* @param leader 安排给一个组长
*/
public void command(String thing, Leader leader) {
System.out.println("我是领导,我现在需要处理: " + thing);
leader.doing(thing);
}
}
  • 测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* <p>
* 委派模式,测试类
* </p>
*
* @author yangkai.shen
* @date Created in 2019/8/28 11:28
*/
public class PatternTest {
public static void main(String[] args) {
Boss boss = new Boss();
boss.command("cooking", new Leader());
System.out.println("------------------- ");
boss.command("sewing", new Leader());
System.out.println("------------------- ");
boss.command("selling", new Leader());
}
}
  • 测试结果
1
2
3
4
5
6
7
8
9
10
11
我是领导,我现在需要处理: cooking
我是组长,领导需要: cooking,我来安排任务: cooking
我是厨师,我接到任务,需要做美食。
-------------------
我是领导,我现在需要处理: sewing
我是组长,领导需要: sewing,我来安排任务: sewing
我是缝纫工,我接到任务,需要做衣服。
-------------------
我是领导,我现在需要处理: selling
我是组长,领导需要: selling,我来安排任务: selling
目前办公室没有对应职位的工人

3. UML 图例

4. 应用

1
2
3
4
// 在 Spring 中以 Delegate 结尾的一般都是实现了委派模式的
// 例如:BeanDefinitionParserDelegate

// Spring MVC 中的 DispatcherServlet 根据 handlerMapping 转发具体执行逻辑到 Controller

5. 优缺点

优点: 对内隐藏实现, 简化调用。

缺点: 当实际处理业务的类需要扩展时,派发命令的类也需要对应做调整,不符合开闭原则。

6. 完整代码地址

https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/behavioral/delegate

-------------本文结束  感谢您的阅读-------------
xkcoding wechat
欢迎来我的公众号「xkcoding小凯扣丁」逛逛
o(╯□╰)o 赞助一杯咖啡 ~~