定义
一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。
注意:一般为了防止恶意的操作,模板方法都加上final关键字,不允许被覆写。
优点
- 优点
- 封装不变的部分,扩展可变的部分
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现
- 缺点
- 模板方法颠倒了普通抽象类的使用方式,定义了部分抽象,由子类实现,子类执行的结果影响父类的结果。
使用场景
- 多子类有公有的方法。并且逻辑基本相同时
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现
- 重构时,模板方法模式是一个经常使用的模式,把相同代码抽取到父类中,然后通过钩子函数约束其行为
代码实现
package com.lidaxia.design.pattern.creational.template;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/27 21:14
*/
public abstract class HummerModel {
/**
* 启动
*/
protected abstract void start();
/**
* 停止
*/
protected abstract void stop();
/**
* 喇叭声
*/
protected abstract void alarm();
/**
* 引擎启动
*/
protected abstract void engineBoom();
final public void run(){
this.start();
this.engineBoom();
this.stop();
}
protected boolean isAlarm(){
return true;
}
}
package com.lidaxia.design.pattern.creational.template;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/27 21:18
*/
public class HummerH1Model extends HummerModel{
private boolean alarmFlag= true;
@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 引擎声");
}
@Override
protected boolean isAlarm() {
return this.alarmFlag;
}
public void setAlarmFlag(boolean alarmFlag) {
this.alarmFlag = alarmFlag;
}
}
package com.lidaxia.design.pattern.creational.template;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/27 21:20
*/
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 引擎声");
}
@Override
protected boolean isAlarm() {
return false;
}
}