概念与介绍
定义
模板方法模式定义了一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
应用场景
在面向对象程序设计过程中,我们常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
应用举例
比如说去健身房,一般都是登记→储物→健身→归还手环,这其中这其中的登记、归还手环对于每个客户来说是一样的,但是客户存储什么物品、选择什么样的健身方式,都是复杂多变的。
主要优点
1.把不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
2.在父类中提取了公共的部分代码,便于代码复用。
3.行为由父类控制,子类实现。
主要缺点
1.每一个不同的实现都需要一个子类来实现,导致类的个数增加,系统更加庞大。
2.父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
3.由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。
结构与实现
模式的结构
模式的实现
//抽象类——健身房锻炼
abstract class GymWorkout {
//模板方法——包括登记、储物、锻炼和归还手环
public void templateMethod() {
registration();
store();
exercise();
returnWristband();
}
//具体方法
public void registration(){
System.out.println("登记信息");
}
public void returnWristband() {
System.out.println("归还手环");
}
//抽象方法——储物和锻炼
public abstract void store();
public abstract void exercise();
}
//具体子类——我的锻炼
public class MyWorkout extends GymWorkout{
//实现抽象方法——储物和锻炼
public void store(){
System.out.println("在储物箱中放入背包");
}
public void exercise(){
System.out.println("进行拉伸,然后跑步2公里");
}
}
//模板方法模式
public class TemplateMethodPattern {
public static void main(String[] args) {
GymWorkout gymWorkout = new MyWorkout();
gymWorkout.templateMethod();
}
}
程序运行结果
登记信息
在储物箱中放入背包
进行拉伸,然后跑步2公里
归还手环