软件设计 模板方法模式 Template Method Pattern

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/17111687.html


提高了代码的复用性扩展性

比如去医院看病,挂号排队这两个步骤是固定的,不管是什么病到了医院都得遵循这两个步骤;但是后续的检查治疗这两个步骤是变化的,不同的病需要采用不同的检查方式,然后采取不同的治疗手段。

针对这一情况,在设计去医院看病这一程序时可以这样实现:定义一个抽象类,固定的步骤用普通方法实现,变化的步骤定义为抽象方法,由子类继承实现。这样就可以根据不同的子类来实现不同的变化步骤,这就是模板方法模式

 

代码实现:

这里以去医院看病来介绍模板模式:

1、定义抽象疾病

/**
* 疾病
*/
public abstract class Disease {
   /**
    * 治病
    */
   public void cure() {
       // 1、挂号
       registered();
       // 2、排队
       queue();
       // 3、检查
       check();
       // 4、治疗
       treat();
  }
   /**
    * 挂号
    */
   public void registered() {
       System.out.println("1、挂号");
  }
   /**
    * 排队
    */
   public void queue() {
       System.out.println("2、排队");
  }
   /**
    * 检查
    */
   public abstract void check();
   /**
    * 治疗
    */
   public abstract void treat();
}
2、定义具体疾病

感冒:

/**
* 感冒
*/
public class Cold extends Disease {
   @Override
   public void check() {
       System.out.println("3、感冒检查:量体温");
  }
   @Override
   public void treat() {
       System.out.println("4、感冒开药:感冒灵");
  }
}
口腔溃疡:

/**
* 口腔溃疡
*/
public class MouthUlcers extends Disease {
   @Override
   public void check() {
       System.out.println("3、口腔溃疡检查:看口腔");
  }
   @Override
   public void treat() {
       System.out.println("4、口腔溃疡开药:西瓜霜");
  }
}
3、调用

// 感冒
Disease cold = new Cold();
// 口腔溃疡
Disease mouthUlcers = new MouthUlcers();
// 治疗感冒
cold.cure();
// 治疗口腔溃疡
mouthUlcers.cure();

输出结果:

1、挂号
2、排队
3、感冒检查:量体温
4、感冒开药:感冒灵
1、挂号
2、排队
3、口腔溃疡检查:看口腔
4、口腔溃疡开药:西瓜霜
   
   
可以发现,在治疗感冒和口腔溃疡这两种疾病时,前两个步骤是一样的,只有后两个步骤是不同的,这样就实现了复用相同的步骤,后续再定义其他疾病时只需要继承 Disease 实现其抽象方法即可,复用性和扩展性都大大提高。    

 

优缺点:

优点

1、利用模板方法将相同处理逻辑的代码放到抽象父类中,提高了代码的复用性

2、将不同的代码交由不同的子类实现,通过对子类的扩展增加新的行为,提高代码的扩展性

缺点

1、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

2、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要添加该方法。

 

使用场景:

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

 

注意事项

为防止恶意操作,一般模板方法都会加上 final 关键词。

 
posted @   kuaiquxie  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示