1、定义
委派模式(Delegate Pattern)又叫委托模式。它的基本作用就是负责任务的调度和任务的分配,将任务的分配和执行分离开来。可以看做是一种特殊情况下的静态代理的全权代理。
不属于23中设计模式。
属于行为型模式
2、应用场景
1、委派对象本身不知道如何处理一个任务或一个请求,吧请求交给其他对象来处理。
2、实现程序的解耦。
3、组成
抽象任务角色(Task):定义一个抽象接口,他有若干个实现类;
委派者角色(Delegate):负责在各个具体角色势力之间做出决策,并判断调用具体实现的方法;
具体人物角色(Concrete):真正执行任务的角色。
现实中的委派模式:老板(Boss)给项目经理(Leader)下达任务,项目经理会根据实际情况给每个员工分发任务,员工完成任务后,再有项目经理吧结果报告给老板。
4、实际业务场景中的应用
类图:
代码:
public class Boss {
public void command(String task,Leader leader){
leader.doWork(task);
}
}
// 员工抽象类=======================================
public interface IEmployee {
void doWork(String task);
}
// 员工A===========================================
public class EmployeeA implements IEmployee {
protected String goodAt = "软件开发";
@Override
public void doWork(String task) {
System.out.println("员工A擅长的领域是:" + goodAt + ",分配的任务是:" + task +"开发");
}
}
// 员工B===========================================
public class EmployeeB implements IEmployee {
protected String goodAt = "销售";
@Override
public void doWork(String task) {
System.out.println("员工B擅长的领域是:" + goodAt + ",分配的任务是:" + task);
}
}
// 项目经理=========================================
public class Leader implements IEmployee {
private Map<String, IEmployee> employeeMap = new HashMap<>();
public Leader(){
employeeMap.put("Java", new EmployeeA());
employeeMap.put("销售软件", new EmployeeB());
}
@Override
public void doWork(String task) {
if(employeeMap.containsKey(task)){
employeeMap.get(task).doWork(task);
}else {
System.out.println("任务分配失败,没有员工可以完成此业务");
}
}
}
测试:
public class Test{
public static void main(String[] args) {
Boss boss = new Boss();
Leader leader = new Leader();
// 老板布置任务给经理
boss.command("Java",leader);
boss.command("销售软件",leader);
boss.command("页面优化",leader);
}
}
// 结果==========================================
员工A擅长的领域是:软件开发,分配的任务是:Java开发
员工B擅长的领域是:销售,分配的任务是:销售软件
任务分配失败,没有员工可以完成此业务
5、源码中的应用
JVM类加载机制:双亲委派机制。
双亲委派:指一个类加载器去加载类时,优先会把请求委派给自己的父类去执行,如果父类加载器还存在父类,就会继续往上委派,直到顶层的类加载器。如果加载成功就不会再执行。如果父类没有加载成功就只能本身去执行。避免类的重复加载。
反射中常用的类Method:invoke(Object,args)方法。
Spring中委派模式的应用:BeanDefinition类,用来封装配置信息在内存中的状态。
DispatcherServlet类,service()方法中的doDispatch()方法
6、优点
通过任务委派能够将一个大型任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,能够加快任务执行效率。
7、缺点
任务委派模式需要根据任务的复杂度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。
8、委派模式与代理模式区别
1、委派模式是行为型模式,代理模式是结构型模式;
2、委派模式注重的是任务派遣,注重结果;
代理模式注重的是代码增强,注重过程。
3、委派模式是一种特殊的静态代理,相当于全权代理。