兄弟们好,今天我们来聊一下模板方法设计模式。
我们在日常的业务开发中如果在一个类中存在一些公共的代码一般会选择方法,而在多个类中存在公共的方法一般会提取一个公共类,以此来减少重复代码的书写。而进行的模板方法设计模式也有点类似,只不过它「强调的是将一个任务的公共代码抽取出来,需要根据不同的条件进行不同处理的留给子类重写。」
我们来看一下它的类图实现:
再来给兄弟们解释一下:「开发者将公共的代码抽取到exec
代码中,然后根据不同的条件的调用method1
,method2
,method3
,抽象类可以提供一个默认的方法实现,但是同时也会留给子类修改这些方法的入口。这就是模板方法设计模式的精髓所在了。是不是感觉很简单」
我们先来看一个代码,然后再来聊一点我们以前看到的模板方法设计模式
「抽象类」
abstract class AbstractClass{
//防止子类重写
public final void exec(){
method1();
method2();
method3();
}
protected void method1(){
System.out.println("这是方法一");
}
protected void method2(){
System.out.println("这是方法二");
}
protected void method3(){
System.out.println("这是方法三");
}
}
「具体实现:」
class SubClass extends AbstractClass{
@Override
protected void method1() {
System.out.println("子类改变方法一");
}
@Override
protected void method3() {
System.out.println("子类改变方法三");
}
}
「客户端执行」
public static void main(String[] args) {
SubClass subClass = new SubClass();
subClass.exec();
}
代码很简单,就是一个简单的模板方法的演示。兄弟们应该可以发现一个点,在代码中强调了一个思想,「通过父类调用子类的方法,而不是我们常见的通过子类的调用父类的方法,父类需要什么就去子类找什么。」
另外兄弟们,还记得几乎每一个框架都会存在一个生命周期嘛。它怎么实现的,结合今天对的模板方法设计模式思考一下,它事先抽象了一个方法用于执行这一系列的生命周期方法,而这些方法它没有给具体的实现,具体的实现由开发者实现。比如:Spring
,Vue
生命周期钩子函数等等。另外我们在写JavaScript
的时候,最常见的就是所谓的回调函数,这个东东也是一个模板方法设计模式实现的。