设计模式 -- 模板模式

140 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

含义: 定义一个通用的算法框架,然后将其他的步骤延迟到它的子类中。子类能够在不改变算法结构的情况下重新定义该算法的某些特定步骤。

列举一下上课的情况吧,就拿A、B、C、D四个人来说吧

1.首先写一个超类

 public abstract class Student{
     protected String name;
  
     public Student(String name){
         this.name = name;
     }
  
     //记录一节课的情况
     public final void class(){
         System.out.println("开始上课");
         enterClassroom();
         openBook();
         learn();
         closeBook();
         exitClassroom();
         System.out.println("结束上课");
     }
     
     //进入教室
     private void enterClassroom(){
         System.out.println(name + "进入教室");
     }
     
     //打开书
     private void openBook(){
         System.out.println(name + "打开书");
     }
     
     //学习
     public abstract void learn();
  
     //合上书
     private void closeBook(){
         System.out.println(name + "合上书");
     }
  
     //离开教室
     private void exitCompany(){
         System.out.println(name + "离开教室");
     }
 }

2.既然是上课,当然有不同的人干各种各样的事情了

 public class AStudent extends Student{
  
     public AStudent(String name){
         super(name);
     }
  
     @Override
     public void learn(){
         System.out.println(name + "认真听课");
     }
 }
 
 public class BStudent extends Student{
  
     public BStudent(String name){
         super(name);
     }
  
     @Override
     public void learn(){
         System.out.println(name + "发呆");
     }
 }
 
 public class CStudent extends Student{
  
     public CStudent(String name){
         super(name);
     }
  
     @Override
     public void learn(){
         System.out.println(name + "打瞌睡");
     }
 }
 
 public class DStudent extends Student{
  
     public DStudent(String name){
         super(name);
     }
  
     @Override
     public void learn(){
         System.out.println(name + "玩手机");
     }
 }

好了这就是模板模式了,简单吧,就像它的定义一样简单,当然了如果超类中设置了实现,子类同样可以选择覆盖或者不覆盖。

优点: 1、对不需要改变的部分进行封装,把子类不相同的部分开放处理,完全符合“开闭原则。 2、都使用共同的代码,维护是非常容易的。 3、子类只需要负责实现。

缺点: 如果有许多子类,则会使得系统变得非常庞大。

那么我们要在什么情况下使用模板方法呢?模板顾名思义就是一个模子刻出来的,所以当子类拥有共同的并且逻辑相同的方法的时候,我们就去使用它。

注意事项: 一般模板方法都加上 final 关键词。