模板(Template)模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wsgsm/article/details/90708245

概念

一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

使用场景

  1. 当要完成一件事情,它有固定的程序流程,但某些步骤是自定义的,使用模板方法
  2. 当需要创建框架时,在超类中提供一个基础的方法,达到代码的复用,并允许子类指定行为

示例:

//抽象类
public abstract class templateClass {

    //模板方法,用final修饰,不允许子类覆盖。模板方法定义了流程(算法) a->b->c
    final void templateFun(){
        a();
        b();
        c();
    }
     
    //a步骤
    void a(){
         System.out.println("第一步: a");
    }
     
    //b步骤 抽象方法:子类必须实现
    abstract void b();
     
    //c
    void soak(){
        System.out.println("第三步: c");
    }
}

子类one实现

public class One extends templateClass{
    @Override
    void b() {
        System.out.println("第二步: one-b");
    }
}

子类two实现

public class Two extends templateClass{
    @Override
    void b() {
        System.out.println("第二步: two-b");
    }
}

测试

public class Test {
    public static void main(String[] args){
      
        System.out.println("one步骤 a->b->c");
        templateClass oneTemplateClass = new One();
        oneTemplateClass.templateFun();
         
        System.out.println("two步骤 a->b->c");
        templateClass twoTemplateClass = new Two();
        twoTemplateClass.templateFun();
    }
}

模板模式之钩子方法

//抽象类
public abstract class templateClass {

    //模板方法,用final修饰,不允许子类覆盖。模板方法定义了流程(算法) a->b->c
    final void templateFun(){
        a();
        b();
        if(isRunC()){
           c(); 
        }
    }
     
    //a步骤
    void a(){
         System.out.println("第一步: a");
    }
     
    //b步骤 抽象方法:子类必须实现
    abstract void b();
     
    //c
    void soak(){
        System.out.println("第三步: c");
    }
    
    //钩子方法,是否执行c步骤
    boolean isRunC(){
        return true;
    }
}

子类one实现

public class One extends templateClass{
    @Override
    void b() {
        System.out.println("第二步: one-b");
    }
    ////覆盖钩子方法
    @Override
    boolean isRunC(){
        return false;
    }
}

子类two实现

public class Two extends templateClass{
    @Override
    void b() {
        System.out.println("第二步: two-b");
    }
    //覆盖钩子方法
    @Override
    boolean isRunC(){
        return true;
    }
}

测试

public class Test {
    public static void main(String[] args){
      
        System.out.println("one步骤 a->b->c");
        templateClass oneTemplateClass = new One();
        oneTemplateClass.templateFun();
         
        System.out.println("two步骤 a->b->c");
        templateClass twoTemplateClass = new Two();
        twoTemplateClass.templateFun();
    }
}

猜你喜欢

转载自blog.csdn.net/wsgsm/article/details/90708245
今日推荐