委派模式
委派模式又叫委托模式,是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。他的基本作用就是负责任务的调用和分配任务,是一种特殊的静态代理,可以理解为全权代理,但是代理模式注重过程,而委派模式注重结果。
委派模式在生活中的应用像是公司架构中,Boss给Leader下达任务,Leader根据下属员工的能力给员工派发任务,工作完成后再由Leader想Boss进行工作汇报。
Leader必须事先知道自己的手下员工能做什么,事先将各个员工对号入座,便于后边分配任务的时候快速找到目标完成任务。
public class Leader {
private static Map<String,Employee> map = new HashMap<>();
static{
map.put("write_document",new EmployeeA());
map.put("programming",new EmployeeB());
}
public String doDispatch(String command) {
return map.get(command).process(command);
}
}
员工只要做好自己的事情即可:
public interface Employee {
String process(String command);
}
public class EmployeeA implements Employee {
@Override
public String process(String command) {
return command + "已完成";
}
}
public class EmployeeB implements Employee {
@Override
public String process(String command) {
return command + "已完成";
}
}
Boss只需要发送命令即可:
public class Boss {
public String sendCommand(String command){
return new Leader().doDispatch(command);
}
}
测试:
public class Test {
public static void main(String[] args) {
String rst = new Boss().sendCommand("programming");
System.out.println(rst);
rst = new Boss().sendCommand("write_document");
System.out.println(rst);
}
}
programming已完成
write_document已完成
特别关注的是Leader必须要将未来可能要调用来完成任务的对象先缓存起来。
委派模式最为人熟知的就是SpringMVC中的DispatcherServlet,他的原理也是事先(项目启动的时候)将请求的路径和请求的controller及其请求的方法一一对应并保存起来,当前端发来请求,通过请求路径找到方法并实现调用。这只是一个简化的委派模式,真正在使用的时候会灵活运用各种容器、内部类等来实现缓存。
一般在Spring源码中看到Delegate结尾的方法都可以研究下,基本都是使用了委派模式。
总结
委派模式的优缺点:
通过任务委派讲一个大型的任务细化,然后通过统一管理子任务的完成情况,能够加快任务的执行效率。
任务委派方需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。