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+": ----------"); System.out.printf("第一步:备%s ---------- ",courceName); } @Override public void teachCource() { System.out.printf("第二步:正在%s教学 ---------- ",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作业 ---------- ",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作业 ---------- ",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、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改。