模板方法
什么是模板方法?
子类继承父类时,不同子类之间不应该有重复代码。定义一个操作中的算法骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。
模板方法的应用场景
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤再更详细的层次上的实现可能不同时,我们使用该方法。
大白话解释:父类中有一个方法实现一个功能,子类重写这个方法具体实现功能,但是不同子类实现该功能时只有少部分代码不一致,因此我们应该再提炼可以重复书写的代码出来,这就是模板方法。
怎么实现模板方法
抽象介绍
public abstract class Parent {
public abstract void primitiveOperation();
public void TemplateMethod(){
System.out.println("重复代码片段");
primitiveOperation();
}
}
class Son extends Parent{
@Override
public void primitiveOperation() {
System.out.println("子类特有代码");
}
}
class Client{
public static void main(String[] args) {
Parent p = new Son();
p.TemplateMethod();
}
}
具体实现
举个例子:一张试卷多个人考
public abstract class Exam {
public abstract String firstAnswer();
public void answer(){
System.out.print("1+1=?");
System.out.println("答案:"+firstAnswer());
}
}
class StudentA extends Exam{
@Override
public String firstAnswer() {
return "A的答案:3";
}
}
class StudentB extends Exam{
@Override
public String firstAnswer() {
return "B的答案:2";
}
}
class Client1{
public static void main(String[] args) {
Exam a = new StudentA();
Exam b = new StudentB();
a.answer();
b.answer();
}
}
个人体会
实际上模板方法是通过创建多种子类的方式来避免代码重复,“多种子类”而非多个同种子类,实际上我不太明白为什么这里不把这个延迟到子类的操作直接在父类中添加一个属性,我们直接修改这个属性不是也可以吗。也许是为了符合单一职责原则。