委派模式的定义
委派模式的基本作用就是负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果;不属于GOF23种设计模式之一,属于行为型模式
代理模式是对业务逻辑的增强,会对你的业务的前后添加东西,但是委派模式不一定会这么做,注重的是结果。是通过全权代理,完成多个业务模块的调度,然后将结果返回。Spring中的DispatchServlet就是用到了委派模式。
比如餐厅老板,会根据客人的口味让主厨出不同的菜肴,主厨会根据老板的要求,让不同菜系的厨师制作菜肴,并将菜肴返回
/**
* 大老板:负责命令主厨做事情
*/
public class Boss {
public void command(String command, Chef chef) {
chef.command(command);
}
}
/**
* 厨师有很多个,定义抽象类的抽象方法
*/
public interface Cook {
/**
* 去根据命令让对应的厨师做菜
*
* @param command
*/
void cook(String command);
}
/**
* 主厨:接受Boss的命令,去向对应的厨师分发要求
*/
public class Chef {
/**
* 用于存储每名厨师的特长,相当于厨师的简历
**/
private static Map<String, Cook> cooker = new HashMap<>();
public Chef() {
//记录每个厨师擅长的菜系
this.cooker.put("徽菜", new AnhuiCuisine());
this.cooker.put("粤菜", new GudongCuisine());
this.cooker.put("湘菜", new HunanCuisine());
}
/**
* 去执行Boss的请求,调用对应的厨师去做菜
*
* @param command
*/
public void command(String command) {
this.cooker.get(command).cook(command);
}
}
/**
* 徽菜师傅根据命令制作美食
*/
public class AnhuiCuisine implements Cook {
@Override
public void cook(String command) {
System.out.println("开始制作徽菜。。。" + command);
}
}
/**
* 粤菜师傅根据命令制作美食
*/
public class GudongCuisine implements Cook {
@Override
public void cook(String command) {
System.out.println("开始制作粤菜。。。" + command);
}
}
/**
* 湘菜师傅根据命令制作美食
*/
public class HunanCuisine implements Cook {
@Override
public void cook(String command) {
System.out.println("开始制作湘菜。。。" + command);
}
}
/**
* 委派测试
*/
public class DelegateTest {
public static void main(String[] args) {
new Boss().command("粤菜",new Chef());
}
}
从这里就可以看出,委派模式,注重的是结果,并不一定是由主厨亲自操刀来做菜。主厨将餐厅老板的要求委派给了厨师A和厨师B。主厨看上去是老板和厨师之间的一个中介,相当于静态代理一种特殊模式,全权代理。主厨在老板眼里他负责干活实际上,他分发给了下面的员工,他分配工作是需要做一种选择,合理的选择才可以,这也是主厨的作用所在。这个例子在软件公司中也是如此,需求方提出需求,项目经理负责整理需求,并分发任务到每位开发人员上,开发完成后验收任务,最后将任务展示给需求方看。
所以说,委派模式的特征就是可以创建一个中间层的全权代理的对象,去将任务分发和转化,最后将结果统一返回
委派模式在Spring中的实现
在Spring中,包含了Delegate或Dispatch结尾的类一般都是委派模式。