设计模式-22-模板方法
个人github地址:HibisciDai
设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai
processon在线UML类图:processon
[TOC]
设计模式-22-模板方法
模板方法(Template Method)
意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决
一些方法通用,却在每一个子类都重新写了这一方法。
何时使用
有一些通用的方法。
关键代码
在抽象类实现,其他步骤在子类实现。
如何解决
将这些通用算法抽象出来。
应用实例
- 在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
- 西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
- spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点
- 封装不变部分,扩展可变部分。
- 提取公共代码,便于维护。
- 行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
注意事项
一般模板方法都加上 final 关键词。
案例1
旅行有选择走路的方式和路上吃什么干粮有很多选择。
类图
981
代码
pattern22.template.demo1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| 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 endPlay() { System.out.println("Cricket Game Finished!"); }
@Override void initialize() { System.out.println("Cricket Game Initialized! Start playing."); }
@Override void startPlay() { System.out.println("Cricket Game Started. Enjoy the game!"); } }
public class Football extends Game {
@Override void endPlay() { System.out.println("Football Game Finished!"); }
@Override void initialize() { System.out.println("Football Game Initialized! Start playing."); }
@Override void startPlay() { System.out.println("Football Game Started. Enjoy the game!"); } }
|
测试输出
1 2 3 4 5 6 7 8 9
| public class Main { public static void main(String[] args) { Game game = new Cricket(); game.play(); System.out.println(); game = new Football(); game.play(); } }
|
1 2 3 4 5 6 7
| Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished!
Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished!
|