概述
模版方法就是定义一个算法的骨架,将骨架中的特定步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重新定义(重写)该算法的某些特定步骤。
优缺点
优点
- 解决了代码的重复问题
- 提高了代码的可扩展性
- 规定了代码的执行流程
缺点
- 每增加一个实现,必须增加一个子类
例子
中国的伟大在于五千年的历史,诞生了属于自己的医学体系,时至今日,人们看病可以选择中医和西医,两者的去医院看病的大概流程是一致的,但是诊断方法并不同,通过代码形式展现出来。
挂号→诊断→缴费→取药
抽象模版
/**
* @author yz
* @version 1.0
* @date 2020/10/21 11:34
* 医院模板类
*/
public abstract class Hospital {
//治疗
public void medicalTreatment(){
registered();
diagnosis();
pay();
takeMedicine();
}
//挂号
public final void registered(){
System.out.println("挂号");
}
//诊断
public abstract void diagnosis();
//缴费
public final void pay(){
System.out.println("缴费");
}
//取药
public abstract void takeMedicine();
}
具体实现
/**
* @author yz
* @version 1.0
* @date 2020/10/21 11:40
* 中医院
*/
public class ChineseHospital extends Hospital{
@Override
public void diagnosis() {
System.out.println("望闻问切");
}
@Override
public void takeMedicine() {
System.out.println("取中药");
}
}
/**
* @author yz
* @version 1.0
* @date 2020/10/21 11:40
* 西医院
*/
public class WestHospital extends Hospital{
@Override
public void diagnosis() {
System.out.println("化验单、检查单等");
}
@Override
public void takeMedicine() {
System.out.println("取西药");
}
}
测试类
public static void main(String[] args) {
Hospital westHospital=new WestHospital();
westHospital.medicalTreatment();
System.out.println("--------------------------");
Hospital chineseHospital=new ChineseHospital();
chineseHospital.medicalTreatment();
}
挂号
化验单、检查单等
缴费
取西药
--------------------------
挂号
望闻问切
缴费
取中药
总结
模版方法是设计模式中很常见的一种设计模式,易学易用,总体上还是依赖倒置原则,程序要依赖于抽象接口,不要依赖于具体实现