注意:所有文章除特别说明外,转载请注明出处.
简介
在该模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按照需要重写方法实现,但是调用将以抽象类中定义的方式进行。
模板模式
1.创建一个抽象类 它的模板方法被设置为final
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play(){
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
2.创建扩展上述类的实体类
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!");
}
}
3.使用 Game 的模板方法 play() 来演示游戏的定义方式
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
模板模式 番外
1.创建抽象类
package Pattern_Design_Behavior.template_pattern;
public abstract class Hamburger {
//默认是有生菜的
private boolean lettuceHook = true;
public void setLettuceHook(boolean lettuceHook){
this.lettuceHook = lettuceHook;
}
public final void getHumburger(){
topBread();
if (lettuceHook){
lettuce();
}
meat();
bottomBread();
}
protected void topBread(){
System.out.println("上面的面包");
}
protected void lettuce(){
System.out.println("中间的生菜");
}
protected abstract void meat();
private void bottomBread(){
System.out.println("底部的面包");
}
}
2.创建抽象类的实现类
package Pattern_Design_Behavior.template_pattern.impl;
import Pattern_Design_Behavior.template_pattern.Hamburger;
public class CodFishBurger extends Hamburger {
@Override
protected void meat() {
System.out.println("深海鲟鱼");
}
}
3.测试
package Pattern_Design_Behavior.template_pattern.impl;
import Pattern_Design_Behavior.template_pattern.Hamburger;
public class TemplatePattern {
public static void main(String[] args) {
System.out.println("第一个汉堡包");
Hamburger codFishBurger = new CodFishBurger();
codFishBurger.getHumburger();
System.out.println();
System.out.println("第二个汉堡包");
Hamburger codFishBurgerTow = new CodFishBurger();
codFishBurgerTow.setLettuceHook(false);
codFishBurgerTow.getHumburger();
}
}
总结
模板方法是一种非常基础的设计模式,在面向对象中有着大量的应用(如Java的HttpServlet)。它用简洁的机制(抽象函数的多态性)实现为很多应用框架提供灵活的扩展点,是程序复用方面的基本实现结构。
除了提供灵活的应用子步骤变化之外,”不要调用我,让我来调用你”的反向控制结构是模板方法的典型应用。(钩子)