委派模式

委派模式:

  委派模式不属于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("登录");
    }
} 
原文地址:https://www.cnblogs.com/socketqiang/p/11262277.html