template method(模板方法)模式是一种行为型设计模式。它在一个方法中定义了算法的骨架(这种方法被称为template method。模板方法),并将算法的详细步骤放到子类中去实现。template method使得子类能够不改变一个算法的结构就可以重定义该算法的某些特定步骤。

须要指出的是,这里所说的template并非c++中的模板

适用性

算法的骨架事先已确定,仅仅是算法的某些步骤的详细实如今不同的子类中有所不同

优点

  • 算法的基本骨架已确定,子类能够方便地实现算法的变体
  • 避免代码的反复,算法的步骤已经在父类中定义。子类依据须要仅仅须实现某些步骤就可以

应用

template method常常被应用在框架(framework)中,在框架中定义了通用的实现和基础的功能,并为详细的实现预留了“占位符”,框架的使用者仅仅须要又一次定义这些“占位符”就可以。

实现

首先我们定义一个抽象类Game。

在Game类中定义了一个声明为final的template method: play()。

play()方法包括了三个方法的调用,分别为initialize(),startPlay(),endPlay(),这三个方法都声明为abstract类型,表明在子类中须要详细实现这些方法。

Game.java

public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay(); // template method
public final void play(){ // initialize the game
initialize(); // start game
startPlay(); // end game
endPlay();
}
}

接着。我们定义了Basketball和Football类,它们都是Game的子类,并重写了当中的initialize()。startPlay()。endPlay()方法。

Basketball.java

public class Basketball extends 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!");
}
}

Football.java

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!");
}
}

最后,我们编写測试类,例如以下:

TemplatePatternDemo.java

public class TemplatePatternDemo {
public static void main(String[] args) { Game game = new Basketball();
game.play();
System.out.println();
game = new Football();
game.play();
}
}

程序的输出例如以下:

Basketball Game Initialized! Start playing.

Basketball Game Started. Enjoy the game!

Basketball Game Finished!

Football Game Initialized! Start playing.

Football Game Started. Enjoy the game!

Football Game Finished!

參考资料

  1. https://en.wikipedia.org/wiki/Template_method_pattern
  2. http://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html
  3. http://www.tutorialspoint.com/design_pattern/template_pattern.htm

最新文章

  1. 【转】深入浅出JavaScript之this
  2. 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程
  3. Mybatis Generator自动生成的mapper只有insert方法
  4. FreeRadius服务器安装以及error while loading shared libraries问题
  5. 移动端rem页面详谈
  6. jsp打印页面 js代码
  7. 自定义底部tab
  8. pat 1006 Sign In and Sign Out (25)
  9. Linq101-QueryExecution
  10. win7 删除服务
  11. 更好的抽屉效果(ios)
  12. Scala编程入门---面向对象编程之Trait
  13. 【BZOJ5492】[HNOI2019]校园旅行(bfs)
  14. day5 range 用法示例
  15. myeclise 安装
  16. db连接驱动
  17. Vue表单输入绑定(文本框和复选框)
  18. LARAVEL 路由原理分析
  19. Selenium应用代码(常见封装的方法一)
  20. java 实现redis缓存

热门文章

  1. LeetCode(107) Binary Tree Level Order Traversal II
  2. Cocoa-Cocoa框架
  3. Clickomania(区间DP)
  4. 信息安全试验-DES加密!
  5. Python 打印嵌套list中每个数据(遍历列表)
  6. 【bzoj3671】[Noi2014]随机数生成器 贪心
  7. 解决mybatis xml文件代码提示
  8. Spoj-BITDIFF Bit Difference
  9. 【前端学习笔记】关于CSS通过一个块改变另一个块的样式
  10. SQL 随机取出一条数据