16709548b5c9a4097d1b30be.png

场景简介


王大哥的女儿,装饰者模式中提到的那个肤白貌美的程序媛;通过几年的努力成为了一个项目组长,日常的工作由原来的基础开发,转变为工作的分配以及进度的管理,那么她是如何开展工作的呢?

委派模式


委派模式在于指定具体的类,同时保护被指定的类,向调用方屏蔽内部调用细节;正如在我们的日常工作量,一个英明的领导通常只会向项目管理者询问项目的进度以,而不关注哪个功能是由哪个程序员完成的;通常委托模式有如下特性:

  • 供调用方使用,并向其屏蔽内部实现细节
  • 具体功能有被委托者实现
  • 有委托者进行被委托者的选择和调度

代码演示


首先,实现我们定义一个Worker员工接口

public interface Worker {

    /**
     * 执行工作
     */
    void doWork();
}

其次,我们实现一个具体任务执行的员工OriginalWorker

public class OriginalWorker implements Worker {

    @Override
    public void doWork() {
        System.out.println("I am working very hard");
    }
}

然后,我们实现一个任务委派者DelegateWorker

public class DelegateWorker implements Worker {

    private Worker worker;

    public DelegateWorker(Worker worker) {
        this.worker = worker;
    }

    @Override
    public void doWork() {
        System.out.print("Hi Boss,");
        worker.doWork();
    }
}

写一个简单的Demo,来演示整个过程:

public class BossDemo {

    public static void main(String[] args) {
        Worker delegate = new DelegateWorker(new OriginalWorker());
        delegate.doWork();
    }
}

演示效果:

Hi Boss,I am working very hard

总结


以上示例部分读者可能感觉到有些暗讽的味道,但是请谨记技术无罪,有罪的是人;嘻嘻,我们回到重点,委派模式在Spring 和 MyBatis 源码中都有其影子,例如:MyBatis 在实现二级缓存CachingExecutor时,就是利用了委派模式,感兴趣的读者可以取研究一下,或者移步本人的这可能是简书最白话的MyBatis源码解读;简单的类图结构如下:

图片由Idea生成