一把 LOL 案例,學會模板設計模式!
點擊關注公眾號,Java干貨及時送達
作者:叁滴水
博客:https://blog.csdn.net/qq_30285985/
前言
假如開一把lol,必須要做哪些事呢?可以簡化位這三個步驟。選擇英雄,開始游戲,投降。這三個步驟必須按照順序執(zhí)行。映射到代碼中可以想到socket信息傳輸,建立連接,傳輸數(shù)據(jù),關閉連接。
這就是模板模式了大概的樣子,在模板模式中,一個抽象類公開定義了執(zhí)行它的方法的方式模板,它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。
比如玩一把lol,選擇什么英雄都可以,開始游戲后,每個人也有自己的發(fā)育路線,最后是15分鐘投降,還是20分鐘投降,每一局也都不一定(贏了暫時不算)不管誰來玩, 都要遵循這個路線。
一、lol案例
通過玩一盤游戲來初步了解下模板模式。
代碼如下(游戲步驟):
public interface PlaylolGame {
//選擇英雄
void selectHero();
//開始游戲
void startGame();
//游戲結束
void GameOver();
}
代碼如下(玩游戲模板):通過play()方法來固定玩游戲的順序。通過傳入接口來讓不同的玩家來實現(xiàn)。
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沉默,轉(zhuǎn)兩圈,一個大招帶走!~");
}
@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沉默,轉(zhuǎn)兩圈,一個大招帶走!~
* 汗,隊友太坑,20分投了~~
* -----------------------
* 長路漫漫,唯劍作伴!~
* 哈撒給!~,快了起來!~
* 汗,隊友太坑,25分投了~~
*/
}
這樣既可實現(xiàn),不管誰來玩這個游戲,都要來按照這個步驟來玩。最新 Java 核心技術教程,推薦看下。
二、jdbc案例
在真實的情況中并不一定會遇到玩游戲的案例,但是jdbc連接的案例肯定會遇到。每次數(shù)據(jù)庫都要設置連接信息。就是DataSource這個接口,這個接口是javax.sql包下的,是jdk帶的接口,意思是說哪種數(shù)據(jù)庫想通過java語言進行連接,就要實現(xiàn)DataSource這個官方的接口。
比如如果引入mysql的驅(qū)動,那么就會有一個MysqlDataSource實現(xiàn)了DataSource這個接口。
JdbcTemplate有一個傳入DataSource的的構造方法。
代碼如下:
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource) {
this.setDataSource(dataSource);
this.afterPropertiesSet();
}
通過構造方法來設置DataSource的實現(xiàn)。設置完成之后,即可使用JdbcTemplate,最多的方法可能就是execute方法。
代碼如下:現(xiàn)在暫且把代碼分為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;
}
由以上代碼發(fā)現(xiàn),不管使用mysql還是Oracle,如果想使用JdbcTemplate,必須要實現(xiàn)DataSource接口,通過傳入DataSource創(chuàng)建JdbcTemplate對象。JdbcTemplate的方法已經(jīng)固定,不管什么數(shù)據(jù)庫都要遵循這種執(zhí)行流程。
總結
模板模式重點是有固定的處理流程無法修改,但是可以改變某一些流程的處理方式;相對于策略模式來說,策略模式是處理方式(或者說算法)已經(jīng)固定好,但是可以選擇其中一個來處理,側重于選擇。
另外,想學習更多的策略模式,可以關注公眾號Java技術棧,在后臺回復:設計模式,可以獲取我整理的設計模式教程,都是實戰(zhàn)干貨。
本文來自作者「叁滴水」投稿,謝謝分享,也歡迎愛好技術分享的各位技術朋友向「Java技術?!雇陡澹尭嗳丝吹?,投稿方式:關注公眾號「Java技術?!乖诤笈_回復:投稿。






關注Java技術??锤喔韶?/strong>


