设计模式(五):委派模式
目录
概述
委派模式主要用于任务分发调度派遣。委派者是连接任务执行者和调用者媒介。既然媒介它必然需要包含所有执行者的引用对象,在根据调用者的输入选择适当的执行者去执行,委派和代理模式中的静态代理有很多相似的地方,持有执行者的对象引用,具体业务都是执行者来执行。
场景介绍
整天的业务场景是一个项目经理管理和两个成员共同做一个项目,然后客户向项目经理提出需求,项目经理根据任务把事情委派给具体的成员完成。
- 创建一个项目接口,包含一个work方法
public interface Project {
void work(String work);
}
- 创建Li和Zhang两个做项目的人
public class Li implements Project{
@Override
public void work(String work) {
System.out.println("李正在做"+work+"工作");
}
}
public class Zhang implements Project{
@Override
public void work(String work) {
System.out.println("张正在做"+work+"工作");
}
}
-
下面创造项目经理
public class ProjectManager implements Project{ //持有所有成员对象,并封装好分发逻辑 private Map<String, Project> map = new HashMap<>(); public ProjectManager() { map.put("order", new Zhang()); map.put("pay", new Li()); } @Override public void work(String work) { //项目经理的职责就是从引用列表中获取对应的成员对象执行客户的需求 map.get(work).work(work); } } -
最后客户开始提需求了
public class NormalDelegateTest { public static void main(String[] args) { new ProjectManager().work("order"); } }
总结
从刚才的例子可以看出来委派模式的优点在于封装多个执行者做的事情,使调用者不用关心每个执行者是干嘛的,我这个需求究竟该提给谁,只需要对接委派类就可以了。
举的这个例子不能够完全突出委派模式的优势,因为每当新增的执行者委派类还需要增加新的关系映射,所以我们分析DispatcherServlet是怎么做的。spring容器启动的时候会获取所有@Controller/@Restcontroller的类将url和方法初始化到handlerMappings中,请求来的时候去循环匹配,在利用反射调用具体的方法实现,这样就做到了委派类和执行类的解耦,设计比较巧妙与高级,spring源码会在后续分析
对比
委派模式有很多其他设计模式的影子,有点像代理(包含被代理的对象的引用)加策略(分装算法,输入与对应执行者的映射关系)。
与代理模式的区别主要是在业务的侧重点不同。比如前面说了委派注重的是分发调度派遣,代理的目的是通过代理增强被代理的功能,封装一些公共的逻辑。举个例子:古代的媒婆一般知道谁家的孩子什么年龄,你说向他提出要求,让他介绍女孩子给你认识,他会从自己的认知里找个一个和你要求最匹配的人,这就是委派模式。当你们相处的不错,最后要求媒婆去提亲了,这就是代理,娶老婆的是你,但是操办婚事的前前后后(对应代理模式的前增强后增强等)。
2734

被折叠的 条评论
为什么被折叠?



