模板方法(Template Method)模式
模板方法(Template Method)模式
模板方法模式实际上就是封装了一个固定流程,定义该流程有几个步骤组成,具体的步骤可以由子类进行不同的实现。
例如:学生放假了回家团聚的一个场景
1.学校放假了
2.学生乘坐各种交通工具
3.到家团聚
在这个场景中,流程是一样的,只不过是学生们乘坐的交通工具不一样,有的乘坐火车,有的乘坐飞机等。
首先,我们定义抽象的模板方法,模板中goHomeOnVacation()定义了固定的流程,还有“放假”和“到家团聚”的固定方法
具体实现
public abstract class Vacationer {
// 放假了
protected final void holiday() {
System.out.println("我放假了!");
}
// 回家的方式
protected abstract void travel();
// 到家团聚
protected final void home() {
System.out.println("我到家了!");
}
// 放假回家模板流程
public void goHomeOnVacation() {
holiday();
travel();
home();
}
}
由子类实现不同的回家方式
public class byAir extends Vacationer{
@Override
protected void travel() {
System.out.println("我坐飞机回家!");
System.out.println("坐飞机中······");
}
}
public class byTrain extends Vacationer{
@Override
protected void travel() {
System.out.println("我坐火车回家!");
System.out.println("坐火车中······");
}
}
我们编写如下代码进行测试。
public class Main {
public static void main(String[] args) {
System.out.println("学校放假了,学子们准备回家与家人团聚······");
Vacationer zhangshan = new ByAir();
Vacationer lisi = new ByTrain();
System.out.println("张三准备回家了:");
zhangshan.goHomeOnVacation();
System.out.println("李四准备回家了:");
lisi.goHomeOnVacation();
System.out.println("学子们都到家里与家人团聚·······");
}
}
输出结果:
学校放假了,学子们准备回家与家人团聚······
张三准备回家了:
我放假了!
我坐飞机回家!
坐飞机中······
我到家了!
李四准备回家了:
我放假了!
我坐火车回家!
坐火车中······
我到家了!
学子们都到家里与家人团聚·······
模板方法有如下功能
- 能够解决代码冗余问题。
- 把某些算法步骤延迟到子类,子类可以根据不同情况改变/实现这些方法,而子类的新方法不会引起既有父类的功能变化。
- 易于扩展。我们通过创建新类,实现可定制化的方法就可以扩展功能,例如有人乘坐轮船回家。
- 父类提供了算法的框架,控制方法的执行流程,而子类不能改变算法流程,子类方法的调用由父类模板方法决定。
- 父类可以把那些重要的、不允许改变的方法屏蔽掉,不让子类去覆写他们,我们声明这些方法为final或者是private即可。
我们常常使用的生命周期方法就是使用的模板方法。