模板方法模式
2019-08-19 本文已影响0人
lenny611
需求:车的保养流程有 预约,检查,维修。但针对于不同的维修方式,检查和维修的方式不同,但存在默认的维修方式(传统型),该如何设计?
介绍一下模板方法:
模式定义:
定义一个操作算法中的框架,而将这些步骤延迟加载到子类中。
它的本质就是固定算法框架。
解决何种问题:
让父类控制子类方法的调用顺序
模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模式的好处:
开发人员在开发时,只需要考虑方法的实现。不需要考虑方法在何种情况下被调用。实现代码复用。
应用场景:
父类可以控制子类方法的调用顺序
一次性实现一个算法的不变部分(如下图中的reservation方法),并将可变的行为(如下图中的check方法和fixed方法)留给子类来实现。
各子类中公共的行为(reservation, check,fixed三个方法)应被提取出来并集中到一个公共父类中以避免代码重复。
需要通过子类来决定父类算法中某个步骤是否执行(以下代码暂时没有体现),实现子类对父类的反向控制。
代码如下:
/**
* @program: LearningDemo
* @description: 保养流程顶级抽象类
* @author: Lenny
* @create: 2019-08-19 21:54
**/
public abstract class Maintenance {
public void maintenance(){
reservation();
check();
fixed();
}
public final void reservation() {
System.out.println("预约门店");
}
/**
* 检查方法
* @Description: 保养车之前都要先进行检查
* @Author: Lenny
* @Date: 2019/8/19
*/
public abstract void check();
public void fixed(){
System.out.println("采用传统的人工维修方式进行维修");
}
}
/**
* @program: LearningDemo
* @description: 新型的保养方式
* @author: Lenny
* @create: 2019-08-19 22:04
**/
public class NewMaintenance extends Maintenance {
@Override
public void check() {
System.out.println("采用全自动化的方式进行检查");
}
@Override
public void fixed(){
System.out.println("采用全自动化的方式进行维修");
}
}
/**
* @program: LearningDemo
* @description: 传统的保养方式
* @author: Lenny
* @create: 2019-08-19 22:06
**/
public class TraditionalMaintenance extends Maintenance {
@Override
public void check() {
System.out.println("采用传统的人工的方式进行检查");
}
}
/**
* @program: LearningDemo
* @author: Lenny
* @create: 2019-08-19 22:08
**/
public class MaintenanceTest {
public static void main(String[] args) {
Maintenance newMaintenance=new NewMaintenance();
newMaintenance.maintenance();
System.out.println("——————————————————");
Maintenance traditionalMaintenance=new TraditionalMaintenance();
traditionalMaintenance.maintenance();
}
}
输出结果如下:
结果.png