打包算法: 模板方法(Template Method)模式
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!
参考资料
- https://en.wikipedia.org/wiki/Template_method_pattern
- http://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html
- http://www.tutorialspoint.com/design_pattern/template_pattern.htm
版权声明:本文为博主原创文章,未经博主允许不得转载。