定义与结构
模板方法(Template Method)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。
可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。
来看下这个简单模式的结构吧:
1) 抽象类(Abstract Class):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2) 具体类(Concrete Class):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。
模板方法模式的实现
//抽象类--Abstract Class
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();
}
}
//具体类--Concrete Class
public class Cricket extends Game {
@Override
void initialize() {
System.out.println("Cricket Game Initialized!Start Playing");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Cricket Game finished!");
}
}
//具体类--Concrete Class
public class Football extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
验证输出
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!