1、基本概念
模板方法模式( Template Method Pattern )又叫模板方法模式,是指定义一个操作中的算法的框
架,而将一些步骤延迟到子类中。使得子类可以不改变-个算法的结构即可重定义该算法的某些特定步
骤,属于行为型设计模式。
生活中也有很多的案例:例如老师的教学:备课-上课-批改作业;做饭:开火-炒菜-关火;上班:打卡-工作-午休-下班
2、类图和角色
类图:
主要角色:
抽象模板:定义一套标准的流程
具体实现:对某些流程的具体实现
3、案例
老师的备课模板:备课——上课——批改作业
类图:
抽象模板:AbstractCourceTemplate,定义了备课的一套流程,并设置了钩子函数,只有当布置了作业才去批改作业
有子类的决定是否需要布置作业
public abstract class AbstractCourceTemplate implements ICource{
protected String courceName;
public AbstractCourceTemplate(String courceName){
this.courceName = courceName;
}
//创建课程,final修饰避免子类修改
public final void cource(){
preCource();
teachCource();
//判断是否布置了作业
if(!isArrangeHomework()){
System.out.println("没有布置作业!!!");
}else{
doHomework();
}
}
@Override
public void preCource() {
System.out.println(courceName+":\n----------");
System.out.printf("第一步:备%s \n----------\n",courceName);
}
@Override
public void teachCource() {
System.out.printf("第二步:正在%s教学 \n----------\n",courceName);
}
@Override
public abstract void doHomework();
//钩子函数
public abstract boolean isArrangeHomework();
}
具体实现:EnglishCource
public class EnglishCource extends AbstractCourceTemplate {
public EnglishCource(String courceName) {
super(courceName);
}
@Override
public void doHomework() {
System.out.printf("第三步:检查%s作业 \n----------\n",super.courceName);
}
@Override
public boolean isArrangeHomework() {
//没有布置作业
return false;
}
}
具体实现:MathCource
public class MathCource extends AbstractCourceTemplate {
public MathCource(String courceName) {
super(courceName);
}
@Override
public void doHomework() {
System.out.printf("第三步:检查%s作业 \n----------\n",super.courceName);
award();
}
public void award(){
System.out.println("这份作业写得太棒了,奖励他五毛");
}
@Override
public boolean isArrangeHomework() {
//布置了作业
return true;
}
}
测试:
public class Test {
public static void main(String[] args) {
AbstractCourceTemplate cource = new MathCource("数学课");
cource.cource();
}
}
输出;
数学课:
----------
第一步:备数学课
----------
第二步:正在数学课教学
----------
第三步:检查数学课作业
----------
这份作业写得太棒了,奖励他五毛
英语课:
----------
第一步:备英语课
----------
第二步:正在英语课教学
----------
没有布置作业!!!
4、优缺点
优点:
1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
3、把不变的行为写在父类上,去除子类的重复代码,提供了一一个很好的代码复用平台,符合开闭原则。
缺点:
1、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改。