1 概念
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类不可以改变一个算法的结构即可重定义该算法的某些特定步骤。
--摘自<<设计模式之禅>>
2 概念理解
这个定义可以这么理解,利用Java的继承机制,定义一个抽象的父类,父类定义了一些方法和顺序诸如此类的骨架,某些特定的方法由子类去实现。抽象父类的方法分两类:
-
基本方法
也叫基本操作,由子类实现的方法,且在模板方法被调用
-
模板方法
父类可以有一个或者几个具体方法一个框架实现对基本方法的调度逻辑,一般加上final关键字不允许被覆写,防止恶意操作
3 使用的场景
-
多个子类有多个公共方法且逻辑相同时
-
重要复杂的逻辑方法可以把核心的方法设计为模板方法,其他细节由子类去实现.
4 模式优缺点
4.1 模板方法模式的优点
-
封装不变的部分,对变化可拓展
把不变的方法逻辑封装到父类,可变的部分通过继承延伸到子类去实现
-
解耦出公共的代码,方便维护
-
行为由父类控制,子类实现
4.2 模板方法模式的缺点
模板方法的抽象类定义了部分抽象方法,由子类去实现,子类的行为结果影响了父类的结果。而一般的抽象类负责声明事物的属性和方法,实现类完成具体的事物属性和方法。在复杂的项目中会在一定程度上增加代码阅读难度。
5 参考例子
游戏抽象类:
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play() {
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
具体实现类:
public class Cricket extends Game{
@Override
void initialize() {
System.out.println("Cricket Game Finished!");
}
@Override
void startPlay() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void endPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
测试类:
public class JavaDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
}
}
结果:
Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished!
才疏浅薄,有误望指正