模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。----WIKIPEDIA
个人理解
模板方法模式相对而言比较简单,一般的都是由抽象类定义好模板方法,然后,子类通过继承并实现其父类中定义好的模板中需要执行的具体的方法,调用子类对象的模板方法时,会执行该类中的具体实现的方法。这个模式我个人的感觉有点像是面向过程的操作,执行完一道工序,接着下一道工序。
案例解析
模板方法相对来说比较简单,这里只列举一个例子供大家参考下。
场景介绍:汽车,无非是启动、开路、停车,就这几部,对于这样的流程基本上固定的行为我们可以考虑采用模板方法模式来进行设计。
类的结构图
主要代码
抽象类
public abstract class Car {
public abstract void startUp();
public abstract void run();
public abstract void stop();
public void templateMethod(){
this.startUp();
this.run();
this.stop();
}
}
实现类
public class BYDCar extends Car{
@Override
public void startUp() {
System.out.println("BYDCar 启动!");
}
@Override
public void run() {
System.out.println("BYDCar 跑起来!");
}
@Override
public void stop() {
System.out.println("BYDCar 停止!");
}
}
public class HongQiCar extends Car{
@Override
public void startUp() {
System.out.println("HongQiCar 启动!");
}
@Override
public void run() {
System.out.println("HongQiCar 跑起来!");
}
@Override
public void stop() {
System.out.println("HongQiCar 停止!");
}
}
测试类
public class MainTest {
public static void main(String[] args) {
HongQiCar hongQiCar = new HongQiCar();
BYDCar byd = new BYDCar();
hongQiCar.templateMethod();
byd.templateMethod();
}
}
模板方法模式优点
1. 封装不变部分,扩展可变部分:把认为不变的部分封装到父类去实现,可变的部分可以通过继承来继续扩展。
2. 提取公共部分代码,便于维护。
3. 行为由父类控制,子类实现,基本方法时由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。
模板方法模式缺点
模板方法模式颠倒了阅读顺序,我们要想知道子类中模板方法的执行顺序需要去父类中查看,复杂的项目中造成代码阅读的难度。
模板方法模式使用场景
1. 多个子类有共有的方法,并且逻辑基本上相同的时候。
2. 重构,将相同的代码抽取到父类中。
源码下载
推荐阅读
"围观"设计模式(16)--结构型之组合模式(Composite Pattern)
"围观"设计模式(17)--结构型之享元模式(Flyweight Pattern)