1. 模式简介
负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程
,而委派模式注重结果
;属于行为型设计模式
;不属于23种设计模式
。
2. 示例代码
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
|
public interface Worker {
void doing(String thing); }
public class ChefWorker implements Worker {
@Override public void doing(String thing) { System.out.println("我是厨师,我接到任务,需要做美食。"); } }
public class TailorWorker implements Worker {
@Override public void doing(String thing) { System.out.println("我是缝纫工,我接到任务,需要做衣服。"); } }
|
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
|
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()); }
@Override public void doing(String thing) { System.out.println("我是组长,领导需要: " + thing + ",我来安排任务: " + thing); if (OFFICE.containsKey(thing)) { OFFICE.get(thing).doing(thing); } else { System.err.println("目前办公室没有对应职位的工人"); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class Boss {
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
|
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. 应用
5. 优缺点
优点: 对内隐藏实现, 简化调用。
缺点: 当实际处理业务的类需要扩展时,派发命令的类也需要对应做调整,不符合开闭原则。
6. 完整代码地址
https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/behavioral/delegate