模板模式
模板模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
一般是定义一个抽象类,有抽象方法,有骨架方法,骨架方法中会定义这几个抽象方法的调用顺序。
然后再定义多个实现类,继承这个抽象类,那么就得覆盖父类的抽象方法,那么每个实现类调用骨架方法,最终的结构就是按照父类中预先定义好的调用顺序,去调用自己实现的各个抽象方法。这就是效果
举个网上的例子,我觉得写的挺通俗易懂的:
/**
*这个抽象类,有三个抽象方法(initGame,startGame,endGame),
*一个骨架方法playGame,
*骨架方法中主要就是定义了三个抽象方法的执行顺序
*/
public abstract class GameTemplate {
/** 初始化游戏 */
abstract void initGame();
/** 开始游戏 */
abstract void startGame();
/** 结束游戏 */
abstract void endGame();
public final void playGame() {
initGame();
startGame();
endGame();
}
}
/**
* 亡者农药,分别实现三个抽象方法,自己具体实现
*/
public class GloryOfKings extends GameTemplate {
@Override
void initGame() {
System.out.println("初始化亡者农药");
}
@Override
void startGame() {
System.out.println("开始亡者农药");
}
@Override
void endGame() {
System.out.println("结束亡者农药");
}
}
/**
* LOL,也分别实现三个抽象方法,自己具体实现
*/
public class LOL extends GameTemplate {
@Override
void initGame() {
System.out.println("初始化LOL");
}
@Override
void startGame() {
System.out.println("开始LOL");
}
@Override
void endGame() {
System.out.println("结束LOL");
}
}
/**
* 测试,分别拿到两个子类,去调用骨架方法playGame
* 那么最终的结果就是两个子类各自实现的三个抽象方法,
* 都会按照父抽象类中骨架定义的执行顺序依次执行
*
* 子类在实现的过程中没有必要定义这些执行顺序,因为在父类中都做好了
*/
public static void main(String[] args) {
GameTemplate gloryOfKings = new GloryOfKings();
gloryOfKings.playGame();
GameTemplate lol = new LOL();
lol.playGame();
}