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

三、总结

非常基础,常用

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

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

 

变化点与稳定点分离

 

 

posted @ 2019-05-19 23:56  tingtingzhou  阅读(142)  评论(0编辑  收藏  举报