模板方法-定义与类型
- 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤 - 类型:行为型
UML图
模板方法-适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复(代码重构时经常使用,钩子方法)
模板方法-优点
提高复用性
提高扩展性
符合开闭原则
模板方法-缺点
类数目增加
增加了系统实现的复杂度
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
模板方法-扩展
钩子方法
模板方法-相关设计模式
模板方法模式和工厂方法模式
模板方法模式和策略模式
Coding
//一个抽象悍马模型类 HummerModel,然后有两个悍马具体型号的实现类。
public abstract class HummerModel {
//发动了
protected abstract void start();
//停下了
protected abstract void stop();
//喇叭发出声音了
protected abstract void alarm();
//引擎也开始响了
protected abstract void engineBoom();
public final void run(){
this.start();
this.engineBoom();
this.alarm();
this.stop();
}
}
public class HummerH1Model extends HummerModel {
@Override
protected void start() {
System.out.println("悍马H1发动");
}
@Override
protected void stop() {
System.out.println("悍马H1停车");
}
@Override
protected void alarm() {
System.out.println("悍马H1鸣笛");
}
@Override
protected void engineBoom() {
System.out.println("悍马H1引擎发出声响");
}
}
public class HummerH2Model extends HummerModel{
@Override
protected void start() {
System.out.println("悍马H2发动");
}
@Override
protected void stop() {
System.out.println("悍马H2停车");
}
@Override
protected void alarm() {
System.out.println("悍马H2鸣笛");
}
@Override
protected void engineBoom() {
System.out.println("悍马H2引擎发出声响");
}
}
上面的代码有个问题,喇叭是默认响的,人不能控制,怎么完善呢?
注意!钩子方法应该是最开始设计就有的,而不是去完善、纠正错误的
public abstract class HummerModel {
//是否能发动
protected boolean isAlarm() {
return false;
}
//发动了
protected abstract void start();
//停下了
protected abstract void stop();
//喇叭发出声音了
protected abstract void alarm();
//引擎也开始响了
protected abstract void engineBoom();
public final void run(){
this.start();
this.engineBoom();
if(this.isAlarm()){
this.alarm();
}
this.stop();
}
}
public class HummerH1Model extends HummerModel {
private boolean alarmFlag = true;
public void setAlarm(boolean isAlarm){
alarmFlag = isAlarm;
}
@Override
protected boolean isAlarm(){
return this.alarmFlag;
}
@Override
protected void start() {
System.out.println("悍马H1发动");
}
@Override
protected void stop() {
System.out.println("悍马H1停车");
}
@Override
protected void alarm() {
System.out.println("悍马H1鸣笛");
}
@Override
protected void engineBoom() {
System.out.println("悍马H1引擎发出声响");
}
}
模板方法模式在源码中的应用
- HttpServlet
- AbstractList
模板方法模式在DTS项目中的应用
- AbstractCalculateEstCostService
参考文献
https://www.cnblogs.com/weixk/archive/2020/06/09/13070163.html