今天我们来讲一下设计模式里的模板方法。
其实模板方法很好理解,模板嘛,就是造一个模具出来,后面大家按照这个模具结合自己的实际业务逻辑,造出符合自己需求的样子。接下来我们结合代码来看下。
首先我们来定义一个抽象类(汽车)。所有的汽车都可以启动-start()、鸣笛-alarm()、发动起发出声响-engineBoom()、跑起来-run()、停止-stop(),假如我要造一辆奔驰出来,我就需要按照这个模板来(继承Car类),我们可以看到在run()中我们规定了要运行哪些方法,执行这些方法的顺序,并且子类不能修改。此时的run()就可以称为模板方法。而在run()方法中调用的方法我们称为基本方法。
基本方法分为三种:
具体方法:在抽象类中实现的基本方法。
抽象方法:在抽象类中没有实现,而在子类中实现的方法。
钩子函数:我们在Car类中定义了isAlarm()方法,通过这个方法控制是否鸣笛,可以通过子类中方法的返回值控制是否鸣笛,子类的进程钩住了父类的方法,这就是钩子函数。
package com.khstudy.designer.template_mehtod;
/**
* TemplateMehtod模式就是在模板方法中按照一个的规则和顺序调用基本方法
* 是通过汇总或排序基本方法产生的结果集
*/
public abstract class Car {
//汽车启动
protected abstract void start();
//汽车鸣笛
protected abstract void alarm();
//发动机响声
protected abstract void engineBoom();
//汽车停止
protected abstract void stop();
//钩子函数
protected boolean isAlarm() {
return true;
}
/**
* 汽车跑起来
* 定义了调用其他方法的顺序,并且子类不能修改,run()叫做模板方法
* run()中的四个方法是基本方法
* 具体方法:在抽象类中实现的基本方法
* 抽象方法:在抽象类中没有实现,在子类中实现的方法
* 钩子函数:
* 局部钩子仅钩挂您自己进程的事件。
* 远程的钩子还可以将钩挂其它进程发生的事件
*/
public final void run() {
this.start();
this.engineBoom();
if(isAlarm())
{
this.alarm();
}
this.stop();
}
}
奔驰的实现类
package com.khstudy.designer.template_mehtod;
public class BenCh extends Car {
@Override
protected void start() {
System.out.println("奔驰启动。。。");
}
@Override
protected void engineBoom() {
System.out.println("奔驰引擎声音。。。");
}
@Override
protected void stop() {
System.out.println("奔驰停止。。。");
}
@Override
protected boolean isAlarm() {
return false;
}
}