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