最后编写客户端测试代码。
public class Test {
public static void main(String[] args) {
new Boss().command(“海报图”,new Leader());
new Boss().command(“爬虫”,new Leader());
new Boss().command(“卖手机”,new Leader());
}
}
通过上面代码,我们生动地还原了老板分配任务的业务场景,这也是委派模式的生动体现。其类图如下图所示。
2 委派模式在JDK源码中的应用
JDK中有一个典型的委派,众所周知,JVM在加载类时用双亲委派模型,这又是什么呢?一个类加载器在加载类时,先把这个请求委派给自己的父类加载器去执行。如果父类加载器还存在父类加载器,则继续向上委派,直到顶层的启动类加载器;如果父类加载器能够完成类加载,则成功返回;如果父类加载器无法完成加载,则子加载器尝试自己去加载。从定义中可以看到,当双亲委派加载的一个类加载器加载类时,首先不是自己加载,而是委派给父类加载器。下面来看loadClass()方法的源码,此方法在ClassLoader中。在这个类里定义了一个双亲,用于下面的类加载。
public abstract class ClassLoader {
…
private final ClassLoader parent;
…
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
if (c == null) {
long t1 = System.nanoTime();
c = findClass(name);
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.m