说明
模板方法(Template Method)模式是一种行为型模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
应用场景
- 多个子类有共有的方法,并且逻辑基本相同。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。
模式特征
AbstractClass(抽象类角色):实现一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。AbstractClass其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法。它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
ConcreteClasses(具体类角色):实现PrimitiveOperation以完成算法与特定子类相关的步骤。ConcreteClass实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
代码实现
- 抽象类角色
public abstract class Travel {
public abstract void mode();
public void travelToBeijing(){
mode();
}
}
- 具体类角色一
public class TravelByTrain extends Travel {
@Override
public void mode() {
System.out.println("坐火车去北京旅游");
}
}
- 具体类角色二
public class TravelByPlane extends Travel{
@Override
public void mode() {
System.out.println("坐飞机去北京旅游");
}
}
- 客户端测试
public class Client {
public static void main(String[] args) {
Travel travel1 = new TravelByTrain();
travel1.travelToBeijing();
Travel travel2 = new TravelByPlane();
travel2.travelToBeijing();
}
}
- 结果
坐火车去北京旅游
坐飞机去北京旅游
优缺点
优点
- 模板方法模式通过把不变的行为搬移到父类,去除了子类中的重复代码。
- 子类实现算法的某些细节,有助于算法的扩展。
- 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。