我们经常会遇到这么一种场景,就是某个业务流程,这个流程一共得分好几步完成,针对不同的情况,这几步的处理逻辑可能是不一样的,但是整体的流程上就是这么几步,如果遇到这种场景,我们就可以使用我们今天需要分享的设计模式,模板方法模式。这个设计模式在我们的实际生活中也很常见,例如去医院看病,去医院看病,每个人去看病,都是不一样的,你看感冒,他看胃疼,其他人看其他的病,但是呢,医院看病的流程实际上是大致上相同的,一般分为如下几个步骤,挂号、签到、等待叫号、医生诊断、检查指标、医生根据检查报告诊断病因、开处方单、付款拿药、结束。是不是看病都是这么个流程?这就是一种模板方法模式的体现,那么我们如何在代码中来体现这种呢?我们就通过医院看病来进行代码演示
定义一个流程步骤类,源码如下
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();
}
}
效果展示
我们从案例中大体上可以对模板方法的思路有一定的认识,流程步骤相同,流程实现不同的场景就可以使用这种设计模式了。