一。适用场景:类给外部提供的接口中的步骤是固定的,每一个步骤对应类中的一个方法。可以将这些方法定义为抽象方法,由子类实现这些抽象方法。
二。比如,体育比赛,其中的基本步骤都是固定的:开始比赛、比赛进行、结束比赛。可以定义一个抽象类SportsGame,其提供一个对外的接口haveASportsGame(),并定义3个抽象方法:startGame(),inGame(),stopGame()
package cn.edu.tju.app;
public abstract class SportsGame {
abstract void startGame();
abstract void inGame();
abstract void stopGame();
public void haveAGame(){
startGame();
inGame();
stopGame();
}
}
然后定义SportsGame的自类,分别实现上述3个抽象方法
package cn.edu.tju.app;
public class FootballGame extends SportsGame {
@Override
void startGame() {
System.out.println("裁判吹哨,中圈开球");
}
@Override
void inGame() {
System.out.println("抢球&打门");
}
@Override
void stopGame() {
System.out.println("裁判吹哨,停止比赛");
}
}
package cn.edu.tju.app;
public class BasketballGame extends SportsGame {
@Override
void startGame() {
System.out.println("裁判吹哨,中圈争球");
}
@Override
void inGame() {
System.out.println("带球&投篮");
}
@Override
void stopGame() {
System.out.println("裁判吹哨,比赛结束");
}
}
最后,在主类中分别定义FootballGame和BasketballGame类对象,调用在父类SportsGame中定义的接口方法haveAGame()
package cn.edu.tju.app;
public class TemplateMethodTest {
public static void main(String[] args) {
SportsGame footballGame=new FootballGame();
footballGame.haveAGame();
System.out.println("___________________________");
SportsGame basketballGame=new BasketballGame();
basketballGame.haveAGame();
}
}



