1. 程式人生 > 其它 >【圖解設計模式系列】The Template Method Pattern: 模板方法模式

【圖解設計模式系列】The Template Method Pattern: 模板方法模式

技術標籤:Design Pattern

定義:
在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法模式使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

圖解:
在這裡插入圖片描述

然後我看了看例項 這種模式實際上就是鼓勵我們多用介面來儘可能的把同類東西抽象到一個,就像貓是個抽象類,什麼時候我們發現一個新品種的貓 我們就實現一個繼承實現這個貓介面的實體貓類,比如英短貓。

例項

借用網上的例子。把大象裝進冰箱分三步:1、把冰箱門開啟; 2、把大象裝進去; 3、把冰箱門關上

public abstract class AbstractOperator {

    public
void putElephant() { //1、把冰箱門開啟 open(); //2、把大象裝進去 put(); //3、把冰箱門關上 close(); } private void open() { System.out.println("把冰箱門開啟"); } protected abstract void put(); private void close() { System.out.println("把冰箱門關上"
); } } public class ElephantOperator1 extends AbstractOperator { @Override protected void put() { System.out.println("用手直接把大象放進冰箱"); } } public class ElephantOperator2 extends AbstractOperator { @Override protected void put() { System.out.
println("用托盤託著把大象放進冰箱"); } }

例項中的例項

在Spring之中 用到了很多模板模式方法。。畢竟框架要對使用者是可擴充套件的,所以會封裝了一些模板方法,然後部分具體的實現交由子類完成。
以SpringMVC的DispatcherServlet類為例,來說明模板方法模式的應用。

FrameworkServlet {
    
    //初始化SpringMVC容器
    protected WebApplicationContext initWebApplicationContext() {
        ……
        if (!this.refreshEventReceived) {
            onRefresh(wac);
        }
        ……
    }
    
    
    //模板方法
    protected void onRefresh(ApplicationContext context) {
        // For subclasses: do nothing by default.
    }
}

public class DispatcherServlet extends FrameworkServlet{

    @Override
    protected void onRefresh(ApplicationContext context) {
        initStrategies(context);
    }
    
}

DispatcherServlet的父類FrameworkServlet中定義了SpringMVC容器初始化用到的initWebApplicationContext()方法,該方法需要呼叫onReresh()進行重新整理操作,但我們看到onRefresh方法被宣告為抽象的,並可以看到框架開發者給出的註釋,意思是該方法預設不會實現任何邏輯,只是為子類預留的。而在子類DispatcherServlet中實現了具體的邏輯,即進行了初始化策略(初始化DispatcherServlet用到的一些基本元件,如HandlerMapping,HandlerAdapter,異常解析,檢視解析器等)。

也就是說FrameworkServlet並不知道繼承它的子類要完成什麼樣的onRefresh操作,所以只能將其宣告為abstract,並且不實現邏輯,待其子類根據實際的需求進行相應的onRefresh操作。