• 【23种设计模式】之模板方法模式——Template Method


    Template Method

    一、定义

    定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。

    Template Method 使得子类可以不改变(复用)一个算法的结构,即可重定义(override重写)该算法的某些特定步骤。

    二、假设场景

    业务流程分五步,框架里面有固定的流程step1,step3,step5,应用程序使用框架,并自己编写其中的step2,step4

    1、传统思路
    //框架类
    public class Template1_lib {
    
        void step1(){
            System.out.println("step1");
        }
        void step3(){
            System.out.println("step3");
        }
        void step5(){
            System.out.println("step5");
        }
    }
     //框架类
    
    public class Template1_lib {
    ​
        void step1(){
            System.out.println("step1");
        }
        void step3(){
            System.out.println("step3");
        }
        void step5(){
            System.out.println("step5");
        }
    }
    //应用程序类
    public class Template1_app {
        boolean step2(){
            return true;
        }
        void step4(){
            System.out.println("step4");
        }
    ​
        /*
        模拟程序流程
         */
        public static void main(String[] args) {
            Template1_lib lib = new Template1_lib();
            Template1_app app = new Template1_app();
    ​
            lib.step1();
    ​
            if(app.step2()){
                lib.step3();
            }
    ​
            for(int i=0;i<4;i++){
                app.step4();
            }
    ​
            lib.step5();
        }
    }

     

    2、模板模式
    public abstract class Template2_lib {
    ​
        protected void step1(){
            System.out.println("step1");
        }  //稳定
        protected void step3(){
            System.out.println("step3");
        }  //稳定
        protected void step5(){
            System.out.println("step5");
        }  //稳定
    //抽象方法
        public abstract boolean step2();   //变化,由子类实现
        public abstract void step4();      //变化,由子类实现
    //稳定流程骨架
        public void run(){
            step1();
    ​
            if(step2()){
                step3();
            }
    ​
            for(int i=0;i<4;i++){
                step4();
            }
    ​
            step5();
        }
    }
    public class Template2_app extends Template2_lib{
        @Override
        public boolean step2(){
            return true;   //子类重写实现
        }
    ​
        @Override
        public void step4(){
            System.out.println("step4"); //子类重写实现
        }
    ​
        /*
        模拟程序流程
         */
        public static void main(String[] args) {
            Template2_lib lib = new Template2_app();  //多态
    ​
            lib.run();
        }
    ​

    三、总结

    非常基础,常用

    机制简洁,为很多应用程序框架提供了灵活的扩展点,

    “不要调用我,让我来调用你”,反向控制

     

    变化点与稳定点分离

     

     

  • 相关阅读:
    【cf932E】E. Team Work(第二类斯特林数)
    【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
    斯特林数及斯特林反演
    Codeforces Round #608 (Div. 2)
    【cf1272】F. Two Bracket Sequences
    Codeforces Round #606 (Div. 2)
    【hdu4045】Machine scheduling(dp+第二类斯特林数)
    【poj2661】Factstone Benchmark(斯特林公式)
    [USACO1.4] Packing Rectangles
    [CF1313D] Happy New Year
  • 原文地址:https://www.cnblogs.com/tingtingzhou/p/10671991.html
Copyright © 2020-2023  润新知