定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算 法的结构即可重定义算法的某些特定步骤。
定义算法框架
public abstract class AbstractSwordsman {
/**
* /该方法为 final,防止算法框架被覆写
*/
public final void fighting(){
//运行内功,抽象方法
neigong();
//调整经脉,具体方法
meridian();
//如果有武器,则准备武器
if(hasWeapons()) {//2
weapons();
}
//使用招式
moves();
//钩子方法
hook();//1
}
private void hook() {}
protected abstract void moves();
protected abstract void weapons();
protected abstract void neigong();
protected void meridian(){
System.out.println("开启正经与奇经");
}
/**
* 是否有武器,默认是有武器的,钩子方法
* @return
*/
private boolean hasWeapons() {
return true;
}
}
具体实现类
public class ZhangWuJi extends AbstractSwordsman {
@Override
protected void moves() {
System.out.println("使用招式乾坤大挪移");
}
@Override
protected void weapons() {
}
@Override
protected void neigong() {
System.out.println("运行九阳神功");
}
@Override
protected boolean hasWeapons() {
return false;
}
}
public class ZhangSanFeng extends AbstractSwordsman {
@Override
protected void moves() {
System.out.println("使用招式神门十三剑");
}
@Override
protected void weapons() {
System.out.println("使用真武剑");
}
@Override
protected void neigong() {
System.out.println("运行纯阳无极功");
}
@Override
protected void hook() {
System.out.println("突然肚子不舒服,老夫先去趟厕所");
}
}
客户端调用
public static void main(String[] args) {
ZhangWuJi zhangWuJi=new ZhangWuJi();
zhangWuJi.fighting();
ZhangSanFeng zhangSanFeng=new ZhangSanFeng();
zhangSanFeng.fighting();
}
使用场景:
- 多个子类有共有的方法,并且逻辑基本相同时。
- 面对重要、复杂的算法,可以把核心算法设计为模板方法,周边相关细节功能则由 各个子类实现
- 需要通过子类来决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制。
优点:
- 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
- 子类实现算法的某些细节,有助于算法的扩展。
缺点:每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。