模板模式

所谓模板板式,就是在父类中定义算法的主要流程,而把一些个性化的步骤延迟到子类中去实现,父类始终控制着整个流程的主动权,子类只是辅助父类实现某些可定制的步骤。 

好吧,我们用代码来说话吧: 
首先,父类要是个抽象类:

Java代码 

public abstract class TemplatePattern {  
  
    //模板方法  
    public final void templateMethod(){  
          
        method1();  
        method2();//勾子方法  
        method3();//抽象方法  
    }  
    private void method1(){  
        System.out.println("父类实现业务逻辑");  
    }  
    public void method2(){  
        System.out.println("父类默认实现,子类可覆盖");  
    }  
    protected abstract void method3();//子类负责实现业务逻辑  
}  
 


父类中有三个方法,分别是method1(),method2()和method3()。 
method1()是私有方法,有且只能由父类实现逻辑,由于方法是private的,所以只能父类调用。 
method2()是所谓的勾子方法。父类提供默认实现,如果子类觉得有必要定制,则可以覆盖父类的默认实现。 
method3()是子类必须实现的方法,即制定的步骤。 
由此可看出,算法的流程执行顺序是由父类掌控的,子类只能配合。 

下面我们来写第一个子类:

Java代码 

public class TemplatePatternImpl extends TemplatePattern {  
  
    @Override  
    protected void method3() {  
        System.out.println("method3()在子类TemplatePatternImpl中实现了!!");  
  
    }  
  
}  
 


这个子类只覆盖了必须覆盖的方法,我们来测试一下:

Java代码 
  1. TemplatePattern t1 = new TemplatePatternImpl();  
  2. t1.templateMethod();  


在控制台中我们可以看到:

Java代码 
  1. 父类实现业务逻辑  
  2. 父类默认实现,子类可覆盖  
  3. method3()在子类TemplatePatternImpl中实现了!!  


OK,我们来看看勾子方法的使用: 
定义第2个子类,实现勾子方法:

Java代码 
public class TemplatePatternImpl2 extends TemplatePattern {  
  
    @Override  
    protected void method3() {  
        System.out.println("method3()在子类TemplatePatternImpl2中实现了!!");  
  
    }  
  
    /* (non-Javadoc) 
     * @see com.jak.pattern.template.example.TemplatePattern#method2() 
     */  
    @Override  
    public void method2() {  
        System.out.println("子类TemplatePatternImpl2覆盖了父类的method2()方法!!");  
    }  
      
}  
 


来测试一下:

Java代码 
  1. TemplatePattern t2 = new TemplatePatternImpl2();  
  2. t2.templateMethod();  


我们看控制台:

Java代码 

  • 父类实现业务逻辑  
  • 子类TemplatePatternImpl2覆盖了父类的method2()方法!!  
  • method3()在子类TemplatePatternImpl2中实现了!!  


 

你可能感兴趣的:(模板模式)