模板方法模式
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
结构图
应用
比如把大象放入冰箱需要3步
- 打开冰箱门
- 把大象塞进去
- 关上冰箱门
代码实现
public class Elephant {
public void templateMethod() {
// 第一步用打印代替
System.out.println("打开冰箱门");
// 第二步用打印代替
System.out.println("放入大象");
// 第三步用打印代替
System.out.println("关闭冰箱门");
}
}
这样实现完全没有问题,但是如果后面需要变化了,要将长颈鹿、老虎、狮子等等放入冰箱怎么办呢,需要在写一个类,重复以上的代码,只是放入的不是大象而是其他。
重复代码 = 易错 + 难改
这个时候就需要模板方法上场了,代码如下
public abstract class AbstractClass {
/**
* 用于子类自定义的
*/
abstract void primitiveOperation();
public void templateMethod() {
// 第一步用打印代替
System.out.println("打开冰箱门");
// 第二步用打印代替
primitiveOperation();
// 第三步用打印代替
System.out.println("关闭冰箱门");
}
public void openRefrigeratorDoor() {
System.out.println("打开冰箱门");
}
public void closeRefrigeratorDoor() {
System.out.println("关闭冰箱门");
}
}
public class ConcreteClass extends AbstractClass {
@Override
void primitiveOperation() {
System.out.println("将大象放入冰箱");
}
}
要将其他不同的放入冰箱则只需要建立满足需求的子类重写该方法即可。模板方法模式是通过把不变形为搬移至超类,去除子类中的重复代码来体现它的优势。
优点
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。