模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
实现步骤:
- 定义一个抽象类,在类中定义每一步操作的抽象方法,再定义一个final的运行模板方法,使子类无法修改操作流程,只能修改每步操作的具体功能。
//定义一个game抽象类
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play(){
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
- 编写一个实体类去实现抽象类的方法
public class BasketballGame extend Game {
@Override
void endPlay() {
System.out.println("Basketball Game Finished!");
}
@Override
void initialize() {
System.out.println("Basketball Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Basketball Game Started. Enjoy the game!");
}
}
- 使用game定义的模板方法play()来进行游戏
public class PlayGame {
public static void main(String[] args){
Game game = new BasketballGame();
game.play();
}
}
最后控制台输出结果为:
Basketball Game Initialized! Start playing.
Basketball Game Started. Enjoy the game!
Basketball Game Finished!
优缺点
优点
- 封装不变,扩展可变:父类封装了具体流程以及实现部分不变行为,其它可变行为交由子类进行具体实现;
- 流程由父类控制,子类进行实现:框架流程由父类限定,子类无法更改;子类可以针对流程某些步骤进行具体实现;
缺点
- 抽象规定了行为,具体负责实现,与通常事物的行为相反,会带来理解上的困难(通俗地说,“父类调用了子类方法”);