概述
- 定义:定义一个操作的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某种特定步骤
- 试用场景:
- 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制
实现
// 抽象类,定义算法骨架
public abstract class BaseTemplate {
public void use() {
part1();
part2();
}
public abstract void part1();
public abstract void part2();
}
// 实现类,实现指定的步骤
class TemplateMethod1 extends BaseTemplate {
@Override
public void part1() {
System.out.println("TemplateMethod1 part1");
}
@Override
public void part2() {
System.out.println("TemplateMethod1 part2");
}
}
// 实现类,实现指定的步骤
class TemplateMethod2 extends BaseTemplate {
@Override
public void part1() {
System.out.println("TemplateMethod2 part1");
}
@Override
public void part2() {
System.out.println("TemplateMethod2 part2");
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
BaseTemplate t1 = new TemplateMethod1();
t1.use();
BaseTemplate t2 = new TemplateMethod2();
t2.use();
}
}
实际应用
java.io.InputStream#read()
// 抽象方法,由子类实现
public abstract int read() throws IOException;
// 定义算法骨架,调用抽象方法
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();// 调用抽象方法
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}