1.定义
模板方法模式(Template Method Pattern)是定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
多个子类有公有的方法,并且逻辑基本相同时可以采用此方法,在父类中定义好实现不同的方法,实现逻辑相同的代码,避免代码重复出现。类图如下所示:
2.代码实现
//模板
public abstract class HummerModel {
//限制可见范围
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engineBoom();
//final 防止被子类重写
public final void run(){
this.start();
this.engineBoom();
this.alarm();
this.stop();
}
}
//实现类1
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发动引擎");
}
}
//实现类2
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 class main {
public static void main(String[] args) {
HummerH1Model hummerH1Model = new HummerH1Model();
hummerH1Model.run();
HummerH2Model hummerH2Model = new HummerH2Model();
hummerH2Model.run();
}
}
3.注意事项
1.为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。
2.抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。