<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一把 LOL 案例,學(xué)會(huì)模板設(shè)計(jì)模式!

          共 7551字,需瀏覽 16分鐘

           ·

          2021-04-02 11:41

          前言

          假如開(kāi)一把lol,必須要做哪些事呢?可以簡(jiǎn)化位這三個(gè)步驟。選擇英雄,開(kāi)始游戲,投降。這三個(gè)步驟必須按照順序執(zhí)行。映射到代碼中可以想到socket信息傳輸,建立連接,傳輸數(shù)據(jù),關(guān)閉連接。

          這就是模板模式了大概的樣子,在模板模式中,一個(gè)抽象類公開(kāi)定義了執(zhí)行它的方法的方式模板,它的子類可以按需要重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行。

          比如玩一把lol,選擇什么英雄都可以,開(kāi)始游戲后,每個(gè)人也有自己的發(fā)育路線,最后是15分鐘投降,還是20分鐘投降,每一局也都不一定(贏了暫時(shí)不算)不管誰(shuí)來(lái)玩, 都要遵循這個(gè)路線。

          一、lol案例

          通過(guò)玩一盤(pán)游戲來(lái)初步了解下模板模式。

          代碼如下(游戲步驟):

          public interface PlaylolGame {
              //選擇英雄
              void selectHero();
              //開(kāi)始游戲
              void startGame();
              //游戲結(jié)束
              void GameOver();
          }

          代碼如下(玩游戲模板):通過(guò)play()方法來(lái)固定玩游戲的順序。通過(guò)傳入接口來(lái)讓不同的玩家來(lái)實(shí)現(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("草叢陰一下,一個(gè)Q沉默,轉(zhuǎn)兩圈,一個(gè)大招帶走!~");
              }
              @Override
              public void GameOver() {
                  System.out.println("汗,隊(duì)友太坑,20分投了~~");
              }
          }

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

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

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

              @Override
              public void GameOver() {
                  System.out.println("汗,隊(duì)友太坑,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();
              }
              /**
               * 人在塔在!~
               * 草叢陰一下,一個(gè)Q沉默,轉(zhuǎn)兩圈,一個(gè)大招帶走!~
               * 汗,隊(duì)友太坑,20分投了~~
               * -----------------------
               * 長(zhǎng)路漫漫,唯劍作伴!~
               * 哈撒給!~,快了起來(lái)!~
               * 汗,隊(duì)友太坑,25分投了~~
               */

          }

          這樣既可實(shí)現(xiàn),不管誰(shuí)來(lái)玩這個(gè)游戲,都要來(lái)按照這個(gè)步驟來(lái)玩。最新 Java 核心技術(shù)教程,推薦看下。

          二、jdbc案例

          在真實(shí)的情況中并不一定會(huì)遇到玩游戲的案例,但是jdbc連接的案例肯定會(huì)遇到。每次數(shù)據(jù)庫(kù)都要設(shè)置連接信息。就是DataSource這個(gè)接口,這個(gè)接口是javax.sql包下的,是jdk帶的接口,意思是說(shuō)哪種數(shù)據(jù)庫(kù)想通過(guò)java語(yǔ)言進(jìn)行連接,就要實(shí)現(xiàn)DataSource這個(gè)官方的接口。

          比如如果引入mysql的驅(qū)動(dòng),那么就會(huì)有一個(gè)MysqlDataSource實(shí)現(xiàn)了DataSource這個(gè)接口。

          JdbcTemplate有一個(gè)傳入DataSource的的構(gòu)造方法。

          代碼如下:

          private DataSource dataSource;

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

          通過(guò)構(gòu)造方法來(lái)設(shè)置DataSource的實(shí)現(xiàn)。設(shè)置完成之后,即可使用JdbcTemplate,最多的方法可能就是execute方法。

          代碼如下:現(xiàn)在暫且把代碼分為3步,1.建立連接,2傳輸信息,3關(guān)閉連接。

          public <T> execute(StatementCallback<T> action) throws DataAccessException {
              Assert.notNull(action, "Callback object must not be null");
              //1 獲取連接,通過(guò)con來(lái)接收連接信息
              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.關(guān)閉連接
                  JdbcUtils.closeStatement(stmt);
                  DataSourceUtils.releaseConnection(con, this.getDataSource());
              }

              return var7;
          }

          由以上代碼發(fā)現(xiàn),不管使用mysql還是Oracle,如果想使用JdbcTemplate,必須要實(shí)現(xiàn)DataSource接口,通過(guò)傳入DataSource創(chuàng)建JdbcTemplate對(duì)象。JdbcTemplate的方法已經(jīng)固定,不管什么數(shù)據(jù)庫(kù)都要遵循這種執(zhí)行流程。

          總結(jié)

          模板模式重點(diǎn)是有固定的處理流程無(wú)法修改,但是可以改變某一些流程的處理方式;相對(duì)于策略模式來(lái)說(shuō),策略模式是處理方式(或者說(shuō)算法)已經(jīng)固定好,但是可以選擇其中一個(gè)來(lái)處理,側(cè)重于選擇。

          —— END ——

          作者:叁滴水
          博客:https://blog.csdn.net/qq_30285985/

          最近熬夜給大家準(zhǔn)備了515套Java代碼,有一些是業(yè)務(wù)類的小項(xiàng)目,比如Java博客項(xiàng)目,也有腳手架、也有平時(shí)用一些的工具類、21套小程序代碼,也有一些游戲類的項(xiàng)目。

          掃以下二維碼并回復(fù)“828”即可獲取


          如下圖所示


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性爱视频网站 | 豆花国产在线综合 | 国产黄片视频 | 久久久久久久成人无码 | 99国产在线视频 |