【Spring源码解析】—— 委派模式的理解和使用

1、什么是委派模式

委派模式,是指什么呢?从字面含义理解,委派就是委托安排的意思,委派模式就是在作具体某件事情的过程当中,交给其余人来作,这个事件就是在个人完整链路上的一部分,可是复杂度较高的状况下或者我不想作的状况下,彻底能够委派给另外一个类来处理,只要这个结果是符合个人预期的就能够(至关于填空)。node

模板模式与委派模式的区别:模板模式更关注步骤,公共部分会放在模板的骨架步骤中完成,针对子类可能会有特殊的一些操做就能够在特定步骤中从新实现,从模板模式中可以看到清晰的过程步骤。ide

代理模式与委派模式的区别:代理模式就是这个事情就根本不是我作的,可是我只能提供其中关键的一些信息,其余的周边或者在此基础上的扩展均可以交给其余人来作,完整的一个问题,可以获得解决(这是目前理解到的代理模式,后续若是有更新,会从新对这里进行修改)ui

2、Spring中的应用

(一)   iOC相关部分中,在进行对象实例化的过程有用到委派模式?this

在doRegisterBeanDefinitions()即BeanDefinition进行注册的过程当中,会设置BeanDefinitionParserDelegate类型的Delegate对象传给this.delegate,并将这个对象做为一个参数传给:parseBeanDefinitions(root, this.delegate)中,而后主要的解析的工做就是经过delegate做为主要角色来完成的,能够看到下方代码:url

/**

 * Parse the elements at the root level in the document:

 * "import", "alias", "bean".

 * @param root the DOM root element of the document

 */

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {

   //判断节点是否属于同一命名空间,是则执行后续的解析

   if (delegate.isDefaultNamespace(root)) {

      NodeList nl = root.getChildNodes();

      for (int i = 0; i < nl.getLength(); i++) {

         Node node = nl.item(i);

         if (node instanceof Element) {

            Element ele = (Element) node;

            if (delegate.isDefaultNamespace(ele)) {

               parseDefaultElement(ele, delegate);

            }

            else {

               //注解定义的Context的nameSpace进入到这个分支中

               delegate.parseCustomElement(ele);

            }

         }

      }

   }

   else {

      delegate.parseCustomElement(root);

   }

}

其中最终可以走到bean注册部分的是,会进入到parseDefaultElement(ele, delegate)中,而后针对不一样的节点类型,针对bean的节点进行真正的注册操做,而在这个过程当中,delegate会对element进行parseBeanDefinitionElement,获得了一个BeanDefinitionHolder类型的对象,以后经过这个对象完成真正的注册到Factory的操做spa

(二)   在SpringMVC中,类DispatcherServlet,就是:用于HTTP请求处理程序/控制器的中央调度程序,针对经过WEB UI输入的url请求,委派给DispatcherServlet处理,从委派者的角度来看,关注结果便可代理

(三)   实际生活的例子:委派能够理解成Leader来作工做,也会作一部分,只是将其中一个部分交给Member来作,Member按照本身的方式作完以后,Leader只关注结果(这是一个两方的关系,代理模式是一个三方的关系,例如房东+中介+租客,中介相对于房东和租客来讲,都是代理)。code

3、自写demo示例

分别为:Leader类、Member类、StaffdoTask类、StaffInfo类、Task类对象

其中Task类为:任务类;StaffInfo类:雇员信息类;StaffdoTask类:雇员作任务类;Leader类:组长类(委派者),Member类:组员类(被委派者)blog

 

Task类代码以下:

public class Task {
    String id;
    String name;
    String step;
    String deadline;

    public Task(String id, String name, String step, String deadline) {
        this.id = id;
        this.name = name;
        this.step = step;
        this.deadline = deadline;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getDeadline() {
        return deadline;
    }

    public String getStep() {
        return step;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDeadline(String deadline) {
        this.deadline = deadline;
    }

    public void setStep(String step) {
        this.step = step;
    }
}

 

StaffInfo类:

public class StaffInfo {
    String staffid;
    String staffname;

    public StaffInfo(String staffid, String staffname) {
        this.staffid = staffid;
        this.staffname = staffname;
    }

    public String getStaffid() {
        return staffid;
    }

    public void setStaffid(String staffid) {
        this.staffid = staffid;
    }

    public String getStaffname() {
        return staffname;
    }

    public void setStaffname(String staffname) {
        this.staffname = staffname;
    }
}

 StaffdoTask接口,Leader类和Member类实现了该接口

public interface StaffdoTask {
    public void doTask(StaffInfo staffInfo, Task task);
}

Leader类:

public class Leader{

    //假设Leader的角色为区域销售主管,针对店铺进行人员盘点,将A人员分配到1区,将B人员分配到2区
    //店长须要针对区域进行总体管理,包含人员的考勤、平常管理和工做访谈、人员培养等
    //其中销售的工做给到不一样的区的人员主负责

    public void doTask() {
        Task task_gongzuofangtan = new Task("1", "工做访谈",
                "一、跟进每一个区的工做负责人,二、进行访谈交流,三、汇总结果", "20190823");
        Task task_kaoqin = new Task("2", "考勤管理", "一、查看每日每人的考勤状况,二、输出考勤报表",
                "20190823");
        Task[] task_xiaoshou = new Task[3];
        Task xiaoshou_1 = new Task("3", "销售", "一、A区域内的人员出售车辆", "2019-0824");
        Task xiaoshou_2 = new Task("3", "销售", "一、B区域内的人员出售车辆", "2019-0824");
        Task xiaoshou_3 = new Task("3", "销售", "一、C区域内的人员出售车辆", "2019-0824");
        task_xiaoshou[0] = xiaoshou_1;
        task_xiaoshou[1] = xiaoshou_2;
        task_xiaoshou[2] = xiaoshou_3;

        Task task_huizong = new Task("4", "汇总", "一、将各个区的工做进行整理,二、汇总输出报告", "20190826");

        //作本身的工做
        doRealTask(task_gongzuofangtan);
        doRealTask(task_kaoqin);

        StaffInfo[] staff_xiaoshou = new StaffInfo[3];
        StaffInfo staff_1 = new StaffInfo("1023", "A");
        StaffInfo staff_2 = new StaffInfo("1024", "B");
        StaffInfo staff_3 = new StaffInfo("1025", "C");
        staff_xiaoshou[0] = staff_1;
        staff_xiaoshou[1] = staff_2;
        staff_xiaoshou[2] = staff_3;

        doDispatcherTask(task_xiaoshou, staff_xiaoshou);

        doRealTask(task_huizong);
    }

    public void doRealTask(Task task){
//        System.out.println("task info");
        System.out.println("taskid:" + task.id + " taskname:" + task.name +
                " taskstep:" + task.step + " taskdeadline:" + task.deadline);
    }

    //Desc:进行任务分发处理
    public void doDispatcherTask(Task[] tasks, StaffInfo[] staffInfos){
        System.out.println("作销售任务的委派");
        for (int i = 0; i < tasks.length; i++){
            Member member = new Member();
            member.doTask(staffInfos[i], tasks[i]);
        }
    }

    public static void  main(String[] args){
        System.out.println("开始工做,并作好任务分派");
        Leader leader = new Leader();
        leader.doTask();
    }
}

Member类:

public class Member implements StaffdoTask{

    @Override
    public void doTask(StaffInfo staffInfo, Task task) {
        System.out.println("statff " + staffInfo.staffid + "do the task:" + task.id + " " +task.name
         + " " + task.step + " " + task.deadline);
    }
}

其中Leader类的main代码运行以后,结果以下:

 

相关文章
相关标签/搜索