前言
委派模式不属于GOF23种设计模式, 主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色.
实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法.
委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部
应用场景
我们在这里举一个程序员都在亲身经历的例子:项目经理分配任务。
上图中的老板相当于客户端,他只会将任务丢给项目经理
项目经理:在老板眼里,他是负责干活的,实际上只是负责任务调度,权衡任务委派给不同的人,类似于策略模式
通俗理解:我们在项目开发中都是一个项目团队,老板把任务交给项目经理后,项目经理制定项目计划、将任务下发到底下的开发人员,这就是委派模式。但是我们发现这个跟之前学的代理模式非常相似,其实这也可以当做是静态代理模式的一种特例。此外,项目经理接到任务后会做一个权衡,怎么去选择分配这些任务。我们又发现这个跟之前学的策略模式非常相似,其实这也可以当做是策略模式的一种特例。(其实设计模式一般都不会独立存在,都是混合使用)
案例实现
Work:抽象接口
/** 抽象接口(工作) * @author WangZhiJun */ public interface Work { /** * 工作任务 */ void doing(); }
FontEndWorker:具体任务角色,前端工程师
/** 前端工程师 * @author WangZhiJun */ public class FrontEndWoker implements Work { @Override public void doing() { System.out.println("前端工程师开始工作"); } }
BackEndWorker: 后端工程师
/** 后端工程师 * @author WangZhiJun */ public class BackEndWorder implements Work{ @Override public void doing() { System.out.println("后端工程师开始工作"); } }
Dispatcher:委派者,也就是案例中的项目经理
/** 委派者(项目经理) * @author WangZhiJun */ public class Dispatcher implements Work{ private Work worker; /** * 项目经理,虽然也有执行方法 * 但是他的工作职责是委派任务给其他人 */ Dispatcher(String task) { if (task.equals("前端")) { this.worker = new FrontEndWoker(); } else { this.worker = new BackEndWorder(); } } @Override public void doing() { this.worker.doing(); } }
Boss:客户端,老板
/** 老板 * @author WangZhiJun */ public class Boss { public static void main(String[] args) { Dispatcher dispatcher = new Dispatcher("前端"); //看上去好像是我们的项目经理在干活 //但实际干活的人是普通员工 //这就是典型,干活是我的,功劳是你的 dispatcher.doing(); } }
运行结果
从上面可以看出来委派模式就是静态代理和策略模式的一种特殊组合,代理模式注重的是过程,委派模式注重的是结果。策略模式注重的是可扩展(外部扩展),委派模式注重的是内部的灵活和复用。
优点: 对内隐藏实现, 易于扩展; 简化调用;
委派模式大量使用在spring,mybatis等开源框架中, 理解委派模式的实现原理可以更好理解这些框架源码.委派模式的核心是委派类的实现
DispatcherServlet: 如Spring的DispatcherServlet.其实真的去执行方法的人并不是这个 DispatcherServlet,而是他通过handle中预先加载了各个controller中method对应的URL,保存在内存中,当有请求过来,他拿到这个请求所对应的 URL,然后去比较,找到对应的就交给对应的Method去执行。
到此对于策略模式,代理模式,委派模式还是优点混淆,下文我们再做理解!