总纲
- 设计原则:破坏里氏替换,体现功能复用
- 常用场景:一批子类的功能有可提取的公共算法骨架
- 使用概率:80%
- 复杂度:中低
- 变化点:算法骨架内各个步骤的具体实现
- 选择关键点:算法骨架是否牢固
- 逆鳞:无
模板方法
- 通常情况下,模板方法模式用于定义构建某个对象的步骤与顺序,或者定义一个算法的骨架。
- 类加载器的模板方法
public abstract class ClassLoader {
//这是一个重载方法
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
//这里就是父类算法的定义
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
//这里留了一个方法给子类选择性覆盖
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
}
-
从代码上我们可以看出,在ClassLoader中定义的算法顺序是。
1,首先看是否有已经加载好的类。 2,如果父类加载器不为空,则首先从父类类加载器加载。 3,如果父类加载器为空,则尝试从启动加载器加载。 4,如果两者都失败,才尝试从findClass方法加载。
网友评论