一. 模板设计模式在书中定义:
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
二.模版方法模式的结构
模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:
- 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
- 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
- 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
- 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。
三.实现
1.抽象模板类
package com.zqr.design.templatePattern;
import java.util.ArrayList;
/**
* 抽象模板
* @ClassName: AbsTemplate
*/
public abstract class AbsTemplate {
protected abstract void before();
protected abstract void after();
protected abstract boolean isEat();
/**
* 定义了一系列操作算法
* @Title: excute
* @param @param sportCallBack:钩子函数,用于实现不同的细节操作
*/
private final <T> T excute(SportCallBack<T> sportCallBack) {
System.out.println(sportCallBack.getName());
before();
T sport = sportCallBack.sport();
after();
if (isEat()) {
System.out.println("吃东东,补充体力.....");
}
return sport;
}
/**
* 对子类提供篮球运动
* @Title: playBasketBall
*/
protected final <T> T playBasketBall(String name) {
class BasketBall implements SportCallBack<T>{
@Override
public T sport() {
System.out.println("打篮球.....");
ArrayList<Object> nameLst = new ArrayList<>();
nameLst.add(name);
return (T) nameLst;
}
@Override
public String getName() {
return name;
}
}
return excute(new BasketBall());
}
/**
* 对子类提供足球运动
* @Title: playFootBall
*/
protected final <T> T playFootBall(String name) {
class FootBall implements SportCallBack<T>{
@Override
public T sport() {
System.out.println("踢足球.....");
ArrayList<Object> nameLst = new ArrayList<>();
nameLst.add(name);
return (T) nameLst;
}
@Override
public String getName() {
return name;
}
}
return excute(new FootBall());
}
}
package com.zqr.design.templatePattern;
/**
* 钩子接口,用于模板传参
* @ClassName: SportCallBack
*/
public interface SportCallBack<T> {
T sport();
String getName();
}
2.具体模板类
package com.zqr.design.templatePattern;
import java.util.List;
/**
* 具体模板类:实现excute细节函数
* @ClassName: ConcreteTemplate
*/
public class ConcreteTemplate extends AbsTemplate{
@Override
protected void before() {
System.out.println("热身.....");
}
@Override
protected void after() {
System.out.println("休息.....");
}
@Override
protected boolean isEat() {
return true;
}
/**
* 对外提供篮球运动
* @Title: basketBallPlay
*/
public void basketBallPlay(String name) {
playBasketBall(name);
}
/**
* 对外提供足球运动
* @Title: footBallPlay
*/
public List<Object> footBallPlay(String name) {
return playFootBall(name);
}
}
3.test