在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
比如在使用JDBC连接时,都是标准的一套流程,如果有很多CURD,我们就要重复写很多代码,在这里就可以使用模板方法模式,把这些固定的流程封装成一个模板方法。
举个实际的例子帮助我们更好的理解
直接上类图:
Game是一个抽象类,LOL是其子类,
Game中就提供了模板方法 play( ),并用final修饰,因此子类不能重写破坏模板方法的逻辑。
当然其他游戏同样可以继承Game类,调用其模板方法。
/**
* @author: wangmingxin1
* @create: 2018-11-08 15:35
**/
public abstract class Game {
//基本方法
//定义成protected,不让外部类访问,只能子类继承重写
protected abstract void goBar(); //去网吧
protected abstract void openComputer(); //上机
protected abstract void loginGame(); //登录游戏
protected abstract void start(); //开始打游戏
protected abstract void drink(); //喝饮料
//钩子方法(Hook Method) 子类可以重写
protected boolean isThirsty(){ //我们上网不能一直喝水啊,渴的时候再喝
//最开始到网吧还不渴,渴了再买水
return false;
}
//按照一定的顺序组织
//定义成final 子类不能重写这个方法,修改这个规则 直接调用这个方法
final public void play(){ //这个方法就是传说中的模板方法
this.goBar();
this.openComputer();
this.loginGame();
this.start();
if(this.isThirsty()) {
this.drink();
}
}
}
/**
* 到网吧打英雄联盟
*
* @author: wangmingxin1
* @create: 2018-11-08 15:46
**/
public class LOL extends Game{
private boolean thirsty;
@Override
protected void goBar() {
System.out.println("周末去波网吧耍联盟...");
}
@Override
protected void openComputer() {
System.out.println("老板上机...");
}
@Override
protected void loginGame() {
System.out.println("游戏登录中...");
}
@Override
protected void start() {
System.out.println("欢迎进入召唤师峡谷...");
}
@Override
protected void drink() {
System.out.println("渴了,买瓶可乐喝...");
}
@Override
protected boolean isThirsty() {
return this.thirsty;
}
public void setThirsty(boolean thirsty) {
this.thirsty = thirsty;
}
}
写主函数测试
/**
* @author: wangmingxin1
* @create: 2018-11-08 15:52
**/
public class Main {
public static void main(String[] args){
LOL lol = new LOL();
lol.setThirsty(true);
lol.play();
}
}
运行
我们要扩展功能时,只需要新写其他的类继承Game类,并实现基本方法中的抽象方法
又可以借助钩子方法实现新的逻辑,比如在本例中使用钩子方法来决定是否调用drink( )方法。
模板方法帮助我们封装一个固定的流程,减少代码量,方便功能的扩展。
既统一了主要流程,也提供了很大的灵活性。
父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
一般模板方法都加上final关键字, 防止子类重写模板方法.
可以提供钩子方法,由子类重写
模板方法模式使用场景: 当要完成在某个过程, 该过程要执行一系列步骤 , 这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理
说点什么
1 评论 在 "模板方法模式"
[…] 之前已经有一篇关于模版方法模式的例子 […]