我们经常会遇到这么一种场景,就是某个业务流程,这个流程一共得分好几步完成,针对不同的情况,这几步的处理逻辑可能是不一样的,但是整体的流程上就是这么几步,如果遇到这种场景,我们就可以使用我们今天需要分享的设计模式,模板方法模式。这个设计模式在我们的实际生活中也很常见,例如去医院看病,去医院看病,每个人去看病,都是不一样的,你看感冒,他看胃疼,其他人看其他的病,但是呢,医院看病的流程实际上是大致上相同的,一般分为如下几个步骤,挂号、签到、等待叫号、医生诊断、检查指标、医生根据检查报告诊断病因、开处方单、付款拿药、结束。是不是看病都是这么个流程?这就是一种模板方法模式的体现,那么我们如何在代码中来体现这种呢?我们就通过医院看病来进行代码演示
定义一个流程步骤类,源码如下
public abstract class AbstractDiagnosis {
/**
* 使用医院看病来举例模板方法模式
* 去医院看病,整体的流程是
* 1. 挂号
* 2. 医生叫号
* 3. 医生诊断
* 4. 医生根据病因开处方单
* 5. 付款拿药
* 但是具体的科室就有不同的处理方式
*/
public void treatment() {
//第一步
register();
//第二步
waitCall();
//第三步
diagnosis();
//第四步
prescription();
//第五步
pay();
}
public void register() {
System.out.println("1. 挂号完成,等待医生叫号。");
}
public void waitCall() {
System.out.println("2. 医生叫号。");
}
public abstract void diagnosis();
public abstract void prescription();
public void pay() {
System.out.println("5. 付款成功,取药回家。");
}
}
创建两个不同病的处理类,感冒类
public class GanMaoDiagnosis extends AbstractDiagnosis {
@Override
public void treatment() {
super.treatment();
}
@Override
public void diagnosis() {
System.out.println("3. 病毒感染导致感冒了");
}
@Override
public void prescription() {
System.out.println("4. 给你开点头孢回去吃");
}
}
拉肚子类
public class LaDuZiDiagnosis extends AbstractDiagnosis {
@Override
public void treatment() {
super.treatment();
}
@Override
public void diagnosis() {
System.out.println("3. 你着凉才拉肚子了");
}
@Override
public void prescription() {
System.out.println("4. 给你点999暖胃");
}
}
测试代码
public class Main {
public static void main(String[] args) {
AbstractDiagnosis ganMao = new GanMaoDiagnosis();
ganMao.treatment();
System.out.println("===============分割线===============");
AbstractDiagnosis laDuZi = new LaDuZiDiagnosis();
laDuZi.treatment();
}
}
效果展示

我们从案例中大体上可以对模板方法的思路有一定的认识,流程步骤相同,流程实现不同的场景就可以使用这种设计模式了。
本文通过医院看病流程为例,介绍了模板方法设计模式的概念和应用。模板方法模式允许在抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。文章通过创建抽象诊断类和不同病症的子类,展示了如何在代码中实现这一模式。

被折叠的 条评论
为什么被折叠?



