什么是模版方法模式
现实生活中,模版到处都是,比如,小学生优秀作文模版,购房合同模版,还有生产各种甜品蛋糕的模具。
模版就是一套约定好的规则,套用模版就可以生产出符合规则的具体事物。
具体到编程领域的设计模式,模版就是抽象类的抽象方法。
因为抽象方法只有声明,没有实现,非常适合规则的描述,所以前人就利用抽象类的特性,摸索出了模版方法模式。
设计与实现
模版方法模式是一种非常容易掌握的模式,重点就是抽象类的抽象方法,用抽象方法描述规则逻辑,用抽象类的子类将规则具体化。
好了,不需要讲那么多,看看标准的模版代码就都能懂:
// 抽象类的模版方法
public abstract class Template {
// 模版方法,封装统一的执行逻辑
public void templateMethod() {
method1();
specific();
method2();
}
private void method1(){
System.out.println("首先,执行method1方法...");
}
private void method2(){
System.out.println("最后,执行method2方法...");
}
// 需要子类实现的方法(具体规则)
protected abstract void specific();
}
// 子类将规则具体化
public class Concrete extends Template {
@Override
protected void specific() {
System.out.println("重写抽象方法,实现具体逻辑...");
}
}
// 模式应用场景
public static void main(String[] args) {
Template template = new Concrete();
template.templateMethod();
}
抽象方法specific()
用protected
修饰并非必须的,只是通常这样做会更好一些。
因为,抽象方法是拿给子类做具体实现的,一般无需暴露给外界,外界关注的是模版方法templateMethod()
,而它又在抽象类中早就定义好了,不需要子类再去关注、重写。
抽象类中的method1()
和method2 ()
都是用private
修饰,这也是非必须的,只是针对本例来讲,这两个方法也无需暴露出去。
所以,无论有多少具体的子类,模版方法templateMethod()
的运行逻辑都是固定不变的,子类也无需关心,这也就是模版方法模式的精髓之处。