美文网首页
模板(Template)模式

模板(Template)模式

作者: flyingkid | 来源:发表于2019-07-14 15:24 被阅读0次

    概念

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

    使用场景

    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();
        }
    }
    

    相关文章

      网友评论

          本文标题:模板(Template)模式

          本文链接:https://www.haomeiwen.com/subject/reabkctx.html