委派模式:
委派模式不属于23种设计模式, 主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色.实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法.委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部, 在spring中以 Delegate与 Dispatcher结尾的,都是委派模式。其实委派模式就是代理模式跟策略模式的一种特殊的组合情况。
应用场景:不属于 23 种设计模式之一,是面向对象设计模式中常用的一种模式。这种模式的原理为类 B和类 A 是两个互相没有任何关系的类,B 具有和 A 一模一样的方法和属性;并且调用 B 中的方法,属性就是调用 A 中同名的方法和属性。B 好像就是一个受 A 授权委托的中介。第三方的代码不需要知道 A 的存在,也不需要和 A 发生直接的联系,通过 B 就可以直接使用 A 的功能,这样既能够使用到 A 的各种功能,又能够很好的将 A 保护起来了,一举两得。
意图:
定义抽象接口的一个实现类, 他负责判断和调用哪个实现类的实例。
优点: 对内隐藏实现, 易于扩展; 简化调用;
委派模式大量使用在spring,mybatis等开源框架中, 理解委派模式的实现原理可以更好理解这些框架源码.委派模式的核心是委派类的实现.
如Spring的DispatcherServlet.其实真的去执行方法的人并不是这个 DispatcherServlet,而实他通过handle中预先加载了各个contriller中method对应的URL,保存在内存中,当有请求过来,他拿到这个请求所对应的 URL,然后去比较,找到对应的就交给对应的Method去执行。
这里举个简单的例子,通过 Boss去交代一个任务给项目经理, 项目经理(Leader)自己不干活,但是他知道可以由谁去干这个活,结果分配到手底下的人去做。
先定义一个抽象类:
public interface ITarget { //具体需要谁去干,由子类(项目经理)去决定 // 需要怎么干,由员工定义 void doing(String command); }
先来两个员工(被委派者(Target)):
public class TargetA implements ITarget { @Override public void doing(String command) { System.out.println("我是员工A,我现在开始干" + command + "工作"); } } public class TargetB implements ITarget { @Override public void doing(String command) { System.out.println("我是员工B,我现在开始干" + command + "工作"); } }
项目经理(委派者(Leader))登场:
public class Leader implements ITarget { //作为委派者,他必须知道底下的人谁比较擅长干什么 // 就好比DispatcherServlet 里面哪个handle保存了 controller跟URL的对应关系一样 private Map<String,ITarget> targets = new HashMap<String,ITarget>(); public Leader() { // 员工A适合干加密工作 targets.put("加密",new TargetA()); // 员工B 适合干登陆开发 targets.put("登录",new TargetB()); } //项目经理自己不干活 public void doing(String command){ targets.get(command).doing(command); } }
最后来个测试类,Boss 来发布任务了,这样子项目经理会委派底下的人去干活,而自己干了一下调度的活。
public class Boss { public static void main(String[] args) { //客户请求(Boss)、委派者(Leader)、被委派者(Target) //委派者要持有被委派者的引用 //代理模式注重的是过程, 委派模式注重的是结果 //策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用 //委派的核心:就是分发、调度、派遣 //委派模式:就是静态代理和策略模式一种特殊的组合 new Leader().doing("登录"); } }