目录
1.简介
定义一个操作中算法的框架,将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。它里面涉及到两类方法,一类是基本方法,一类是模板方法。基本方法主要是一些单个方法,模板方法是由基本方法组成,主要是为完成一些固定的逻辑。
2.优点
封装不变,扩展可变。将不变的部分封装到父类,子类通过继承实现可变的扩展。简化了代码,有利于代码维护,也符合OCP。
3.缺点
由于模板方法的实现形式,在复杂的项目中,可能会造成阅读的难度。
4.形式
抽象模板类
public abstract class AClass {
protected abstract void basicMethod1();
protected abstract void basicMethod2();
public void templateMethod() {
basicMethod1();
basicMethod2();
}
}
具体模板类1
public class ConcreteClass1 extends AClass {
protected void basicMethod1() {
System.out.println("具体模板类1方法1");
}
protected void basicMethod2() {
System.out.println("具体模板类1方法2");
}
}
具体模板类2
public class ConcreteClass2 extends AClass {
protected void basicMethod1() {
System.out.println("具体模板类2方法1");
}
protected void basicMethod2() {
System.out.println("具体模板类2方法2");
}
}
具体实现
public class Reality {
public static void main(String[] args) {
AClass class1 = new ConcreteClass1();
AClass class2 = new ConcreteClass2();
class1.templateMethod();
class2.templateMethod();
}
}
5.扩展
有些情况,需要根据外部的需要选择方法运行,那么这里就得提到它的好基友钩子方法。该方法通过外界的控制从而把控具体逻辑的实现,也更加的灵活。
抽象模板类扩展
public abstract class AClass {
protected abstract void basicMethod1();
protected abstract void basicMethod2();
protected boolean isBasicMethod1() {
return true;
}
public void templateMethod() {
if(this.isBasicMethod1()) {
basicMethod1();
}
basicMethod2();
}
}
具体模板类1扩展
public class ConcreteClass1 extends AClass {
private boolean isBM1Flag = true;
protected void basicMethod1() {
System.out.println("具体模板类1方法1");
}
protected void basicMethod2() {
System.out.println("具体模板类1方法2");
}
public void setBasicMethod1(boolean isBM1Flag) {
this.isBM1Flag = isBM1Flag;
}
}
具体模板类2扩展与1类似,最后只需要在实际中输入相应值就好了。