模板方法模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
代码实现
package com.cyc.design.template;
public class Main {
public static void main(String[] args) {
F f = new C1();
// f.op1();
f.m();
}
}
abstract class F {
//在m方法中明确的调用了op1,op2, 这两个方法就是交给子类去实现的
public void m() {
op1();
op2();
}
abstract void op1();
abstract void op2();
}
/**
* c1继承抽象类F, 从而去实现定义好的op1和op2方法
*/
class C1 extends F{
@Override
void op1() {
System.out.println("op1");
}
@Override
void op2() {
System.out.println("op2");
}
}
模式的应用
jvm的classLoader
先看代码
public class TemplateTest {
public static void main(String[] args) throws ClassNotFoundException {
//加载指定目录下的class类, 并输出他的完整类名
Class clazz = TemplateTest.class.getClassLoader().loadClass("com.cyc.design.strategy.Cat");
System.out.println(clazz.getName());
}
}
查看源码
因此 , 自定义ClassLoader类加载器, 只需继承抽象类ClassLoader, 重写findClass方法即可, 这里用到的就是模板方法模式
示例代码如下
public class T006_ClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
File f = new File("c:/test/", name.replace(".", "/").concat(".class"));
try {
FileInputStream fis = new FileInputStream(f);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while ((b=fis.read()) !=0) {
baos.write(b);
}
byte[] bytes = baos.toByteArray();
baos.close();
fis.close();//可以写的更加严谨
return defineClass(name, bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
}
return super.findClass(name); //throws ClassNotFoundException
}
}