一、模板方法模式概述
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
模板方法模式是一种行为型模式。
二、模板方法代码示例
我们以NBA球员打篮球为例,先定义一个抽象模板
package com.tyyd;
public abstract class ShootTemplate {
/*
* 打球投篮的模板方法
* 封装了所有子类共同遵循的算法框架
*/
public final void play() {
//步骤1:运球
dribble();
if(isDefence()) {
//步骤2:晃人
huang();
}
//步骤3:投篮
shoot();
//步骤4:得分
point();
}
/**
* 抽象的基本方法,运球
*/
protected abstract void dribble();
/**
* 基本方法,晃人
*/
private void huang() {
System.out.println("晃人");
}
/**
* 抽象的基本方法,投篮
*/
protected abstract void shoot();
/**
* 基本方法,得分
*/
private void point() {
System.out.println("得分");
}
/**
* Hook, 钩子函数,提供一个默认或空的实现
* 具体的子类可以自行决定是否挂钩以及如何挂钩
* 询问用户是否有防守
*/
protected boolean isDefence() {
return true;
}
}
再定义两个球员来继承这个抽象类,
科比
package com.tyyd;
/**
* 2015年4月8日下午5:54:06
* @version 1.0
*/
public class KobeShoot extends ShootTemplate {
@Override
protected void dribble() {
System.out.println("科比运球!");
}
@Override
protected void shoot() {
System.out.println("科比投篮!");
}
}
詹姆斯
package com.tyyd;
/**
* 2015年4月8日下午5:54:18
* @version 1.0
*/
public class JamesShoot extends ShootTemplate {
private boolean defenceFlag;
@Override
protected void dribble() {
System.out.println("詹姆斯运球!");
}
@Override
protected void shoot() {
System.out.println("詹姆斯投篮!");
}
public boolean isDefence() {
return defenceFlag;
}
public void setDefenceFlag(boolean defenceFlag) {
this.defenceFlag = defenceFlag;
}
}
再定义一个类(教练)来调用两个球员类
package com.tyyd;
/**
* 2015年4月8日下午5:57:58
* @version 1.0
*/
public class Coach {
public static void main(String[] args) {
KobeShoot Kobe = new KobeShoot();
JamesShoot James = new JamesShoot();
James.setDefenceFlag(false);
Kobe.play();
James.play();
}
}
运行教练类结果如下:
科比运球!
晃人
科比投篮!
得分
詹姆斯运球!
詹姆斯投篮!
得分