基本概念
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。也可以通俗地理解为把不变的行为移到超类,从而去除子类中的重复代码。
结构图
上图摘自《大话设计模式》
应用场景
当不可变和可变的行为同时出现在子类中时,在子类的方法中就不可避免地会重复实现那些不变的行为,这是就可以使用模板方法模式,把重复的不变的内容移到超类,作为所谓的模板。
源码示例(将游戏的几个步骤抽象为模板)
1.定义抽象游戏类
package com.spook.template;
/**
* 抽象游戏类,作为模板,假定玩游戏有固定的套路:初始化、开始、结束
*/
public abstract class Game {
abstract void init();
abstract void start();
abstract void end();
/**
* 模板方法,此处定义为final,防止子类覆写
*/
public final void play() {
init();
start();
end();
}
}
2.定义一个网游类
package com.spook.template;
/**
* 网页游戏类,玩游戏也是相同的三个步骤
*/
public class WebGame extends Game {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("网页游戏初始化");
}
@Override
void start() {
// TODO Auto-generated method stub
System.out.println("网页游戏开始");
}
@Override
void end() {
// TODO Auto-generated method stub
System.out.println("网页游戏结束");
}
}
3.定义一个手游类
package com.spook.template;
/**
* 手机游戏类,玩游戏也是相同的三个步骤
*/
public class MobileGame extends Game {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("手机游戏初始化");
}
@Override
void start() {
// TODO Auto-generated method stub
System.out.println("手机游戏开始");
}
@Override
void end() {
// TODO Auto-generated method stub
System.out.println("手机游戏结束");
}
}
4.测试类
package com.spook.template;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Game webGame = new WebGame();
webGame.play();
System.out.println("-------------");
Game mobileGame = new MobileGame();
mobileGame.play();
}
}
运行测试类输出如下内容:
网页游戏初始化
网页游戏开始
网页游戏结束
-------------
手机游戏初始化
手机游戏开始
手机游戏结束