天天看點

一把 LOL 案例,學會模闆設計模式!

前言

假如開一把lol,必須要做哪些事呢?可以簡化位這三個步驟。選擇英雄,開始遊戲,投降。這三個步驟必須按照順序執行。映射到代碼中可以想到socket資訊傳輸,建立連接配接,傳輸資料,關閉連接配接。

這就是模闆模式了大概的樣子,在模闆模式中,一個抽象類公開定義了執行它的方法的方式模闆,它的子類可以按需要重寫方法實作,但調用将以抽象類中定義的方式進行。

比如玩一把lol,選擇什麼英雄都可以,開始遊戲後,每個人也有自己的發育路線,最後是15分鐘投降,還是20分鐘投降,每一局也都不一定(赢了暫時不算)不管誰來玩, 都要遵循這個路線。

一、lol案例

通過玩一盤遊戲來初步了解下模闆模式。

代碼如下(遊戲步驟):

public interface PlaylolGame {
    //選擇英雄
    void selectHero();
    //開始遊戲
    void startGame();
    //遊戲結束
    void GameOver();
}      

代碼如下(玩遊戲模闆):通過play()方法來固定玩遊戲的順序。通過傳入接口來讓不同的玩家來實作。

public class PlayGameTemplate {
    private PlaylolGame playlolGame;
    public PlayGameTemplate(PlaylolGame playlolGame) {
        this.playlolGame = playlolGame;
    }
    public void play(){
        playlolGame.selectHero();
        playlolGame.startGame();
        playlolGame.GameOver();
    }
}      

代碼如下(德瑪玩家的玩法):

public class PlayGailun implements PlaylolGame {
    @Override
    public void selectHero() {
        System.out.println("人在塔在!~");
    }
    @Override
    public void startGame() {
        System.out.println("草叢陰一下,一個Q沉默,轉兩圈,一個大招帶走!~");
    }
    @Override
    public void GameOver() {
        System.out.println("汗,隊友太坑,20分投了~~");
    }
}      

代碼如下(劍豪的玩法):

public class PlayJifengjianhao implements PlaylolGame {
    @Override
    public void selectHero() {
        System.out.println("長路漫漫,唯劍作伴!~");
    }

    @Override
    public void startGame() {
        System.out.println("哈撒給!~,快了起來!~");
    }

    @Override
    public void GameOver() {
        System.out.println("汗,隊友太坑,25分投了~~");
    }
}      

代碼如下(入口):

public class Test {

    public static void main(String[] args) {
        //德瑪玩家
        PlayGameTemplate playGame = new PlayGameTemplate(new PlayGailun());
        playGame.play();
        //劍豪玩家
        PlayGameTemplate jianhao = new PlayGameTemplate(new PlayJifengjianhao());
        jianhao.play();
    }
    /**
     * 人在塔在!~
     * 草叢陰一下,一個Q沉默,轉兩圈,一個大招帶走!~
     * 汗,隊友太坑,20分投了~~
     * -----------------------
     * 長路漫漫,唯劍作伴!~
     * 哈撒給!~,快了起來!~
     * 汗,隊友太坑,25分投了~~
     */
}      

這樣既可實作,不管誰來玩這個遊戲,都要來按照這個步驟來玩。

二、jdbc案例

在真實的情況中并不一定會遇到玩遊戲的案例,但是jdbc連接配接的案例肯定會遇到。每次資料庫都要設定連接配接資訊。就是DataSource這個接口,這個接口是javax.sql包下的,是jdk帶的接口,意思是說哪種資料庫想通過java語言進行連接配接,就要實作DataSource這個官方的接口。比如如果引入mysql的驅動,那麼就會有一個MysqlDataSource實作了DataSource這個接口。

JdbcTemplate有一個傳入DataSource的的構造方法。

代碼如下:

private DataSource dataSource;

public JdbcTemplate(DataSource dataSource) {
    this.setDataSource(dataSource);
    this.afterPropertiesSet();
}      

通過構造方法來設定DataSource的實作。設定完成之後,即可使用JdbcTemplate,最多的方法可能就是execute方法。

代碼如下:現在暫且把代碼分為3步,1.建立連接配接,2傳輸資訊,3關閉連接配接。

public <T> T execute(StatementCallback<T> action) throws DataAccessException {
    Assert.notNull(action, "Callback object must not be null");
    //1 擷取連接配接,通過con來接收連接配接資訊
    Connection con = DataSourceUtils.getConnection(this.getDataSource());
    Statement stmt = null;

    Object var7;
    try {
        Connection conToUse = con;
        if(this.nativeJdbcExtractor != null && this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
            conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
        }

        stmt = conToUse.createStatement();
        this.applyStatementSettings(stmt);
        Statement stmtToUse = stmt;
        if(this.nativeJdbcExtractor != null) {
            stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
        }
        //2 傳輸并且接收傳回的資訊
        T result = action.doInStatement(stmtToUse);
        this.handleWarnings(stmt);
        var7 = result;
    } catch (SQLException var11) {
        JdbcUtils.closeStatement(stmt);
        stmt = null;
        DataSourceUtils.releaseConnection(con, this.getDataSource());
        con = null;
        throw this.getExceptionTranslator().translate("StatementCallback", getSql(action), var11);
    } finally {
        //3.關閉連接配接
        JdbcUtils.closeStatement(stmt);
        DataSourceUtils.releaseConnection(con, this.getDataSource());
    }

    return var7;
}      

由以上代碼發現,不管使用mysql還是Oracle,如果想使用JdbcTemplate,必須要實作DataSource接口,通過傳入DataSource建立JdbcTemplate對象。JdbcTemplate的方法已經固定,不管什麼資料庫都要遵循這種執行流程。

總結

模闆模式重點是有固定的處理流程無法修改,但是可以改變某一些流程的處理方式;相對于政策模式來說,政策模式是處理方式(或者說算法)已經固定好,但是可以選擇其中一個來處理,側重于選擇。