1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java中策略模式和模板方法模式的案例分析-創(chuàng)新互聯(lián)

      小編給大家分享一下Java中策略模式和模板方法模式的案例分析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

      建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡程序員、網(wǎng)頁設計師等,應用各種網(wǎng)絡程序開發(fā)技術和網(wǎng)頁設計技術配合操作的協(xié)同工作。創(chuàng)新互聯(lián)專業(yè)提供網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站制作(企業(yè)站、自適應網(wǎng)站建設、電商門戶網(wǎng)站)等服務,從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!

      策略模式

      簡介

      策略模式(Strategy Pattern)屬于對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。
      其主要目的是通過定義相似的算法,替換if else 語句寫法,并且可以隨時相互替換。

      策略模式主要由這三個角色組成,環(huán)境角色(Context)、抽象策略角色(Strategy)和具體策略角色(ConcreteStrategy)。

      • 環(huán)境角色(Context):持有一個策略類的引用,提供給客戶端使用。

      • 抽象策略角色(Strategy):這是一個抽象角色,通常由一個接口或抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口。

      • 具體策略角色(ConcreteStrategy):包裝了相關的算法或行為。

      示例圖如下:
      Java中策略模式和模板方法模式的案例分析

      這里為了方便理解,我們就拿剛學習Java的時候使用計算方法來說吧。
      在使用計算器進行計算的時候,會經(jīng)常用到加減乘除方法。如果我們想得到兩個數(shù)字相加的和,我們需要用到“+”符號,得到相減的差,需要用到“-”符號等等。雖然我們可以通過字符串比較使用if/else寫成通用方法,但是計算的符號每次增加,我們就不得不加在原先的方法中進行增加相應的代碼,如果后續(xù)計算方法增加、修改或刪除,那么會使后續(xù)的維護變得困難。
      但是在這些方法中,我們發(fā)現(xiàn)其基本方法是固定的,這時我們就可以通過策略模式來進行開發(fā),可以有效避免通過if/else來進行判斷,即使后續(xù)增加其他的計算規(guī)則也可靈活進行調(diào)整。

      首先定義一個抽象策略角色,并擁有一個計算的方法。

      interface CalculateStrategy {
         int doOperation(int num1, int num2);
      }

      然后再定義加減乘除這些具體策略角色并實現(xiàn)方法。

      那么代碼如下:

      class OperationAdd implements CalculateStrategy {
         @Override   public int doOperation(int num1, int num2) {
                return num1 + num2;
         }
      }
      class OperationSub implements CalculateStrategy {
         @Override   public int doOperation(int num1, int num2) {
                return num1 - num2;
         }
      }
      class OperationMul implements CalculateStrategy {
         @Override   public int doOperation(int num1, int num2) {
                return num1 * num2;
         }
      }
      class Operationp implements CalculateStrategy {
         @Override   public int doOperation(int num1, int num2) {
                return num1 / num2;
         }
      }

      最后在定義一個環(huán)境角色,提供一個計算的接口供客戶端使用。
      代碼如下:

      class  CalculatorContext {
          private CalculateStrategy strategy;
          public CalculatorContext(CalculateStrategy strategy) {
                  this.strategy = strategy;
          }    
          public int executeStrategy(int num1, int num2) {
                  return strategy.doOperation(num1, num2);
          }
      }

      編寫好之后,那么我們來進行測試。
      測試代碼如下:

          public static void main(String[] args) {
                int a=4,b=2;
                CalculatorContext context = new CalculatorContext(new OperationAdd());    
                System.out.println("a + b = "+context.executeStrategy(a, b));
           
                CalculatorContext context2 = new CalculatorContext(new OperationSub());      
                System.out.println("a - b = "+context2.executeStrategy(a, b));
           
                CalculatorContext context3 = new CalculatorContext(new OperationMul());    
                System.out.println("a * b = "+context3.executeStrategy(a, b));
          
                CalculatorContext context4 = new CalculatorContext(new Operationp());    
                System.out.println("a / b = "+context4.executeStrategy(a, b));
      }

      輸出結果:

      a + b = 6
      a - b = 2
      a * b = 8
      a / b = 2

      策略模式優(yōu)點:

      擴展性好,可以在不修改對象結構的情況下,為新的算法進行添加新的類進行實現(xiàn);
      靈活性好,可以對算法進行自由切換;

      策略模式缺點:

      使用策略類變多,會增加系統(tǒng)的復雜度。;
      客戶端必須知道所有的策略類才能進行調(diào)用;

      使用場景:

      如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為;
      一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種;
      如果一個對象有很多的行為,如果不用恰當?shù)哪J剑@些行為就只好使用多重的條件選擇語句來實現(xiàn);

      模板模式

      簡介

      模板模式(Template Pattern)中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。 這種類型的設計模式屬于行為型模式。定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。

      模板模式,其主要的的思想就是做一個模板,提供給客戶端進行調(diào)用。除去生活中我們經(jīng)常用到的簡歷模板、合同模板等等,Java中也有很經(jīng)典的模板使用,那就是Servlet,HttpService類提供了一個service()方法,這個方法調(diào)用七個do方法中的一個或幾個,完成對客戶端調(diào)用的響應。這些do方法需要由HttpServlet的具體則由子類提供。

      模板模式主要由抽象模板(Abstract Template)角色和具體模板(Concrete Template)角色組成。

      • 抽象模板(Abstract Template): 定義了一個或多個抽象操作,以便讓子類實現(xiàn)。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟;定義并實現(xiàn)了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現(xiàn)。頂級邏輯也有可能調(diào)用一些具體方法。

      • 具體模板(Concrete Template): 實現(xiàn)父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟;每一個抽象模板角色都可以有任意多個具體模板角色與之對應,而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現(xiàn),從而使得頂級邏輯的實現(xiàn)各不相同。

      示例圖如下:
      Java中策略模式和模板方法模式的案例分析

      這里為了方便理解,我們依舊使用一個簡單的示例來加以說明。
      我們以前在玩魂斗羅、雙截龍、熱血物語、忍者神龜?shù)鹊扔螒虻臅r候,都需要在小霸王游戲機上插卡,然后啟動游戲才能玩,其中魂斗羅這種游戲,啟動游戲之后就可以直接玩了,但是忍者神龜這種游戲則在啟動游戲之后,需要選擇其中一個角色才能開始玩。那么我們可以根據(jù)這個場景寫出一個通用的模板,主要包含啟動游戲,玩游戲,結束游戲這幾個必須實現(xiàn)的方法,選擇人物這個方法改成可選。

      那么這個抽象類的代碼如下:

      abstract class  Game{    
          //啟動游戲    
          protected abstract void  runGame();    
          //選擇人物    
          protected  void choosePerson() {};    
          //開始玩游戲    
          protected abstract void startPlayGame();    
          //結束游戲    
          protected abstract void endPlayGame();    
          //模板方法    
          public final void play() {
              runGame();
              choosePerson();
              startPlayGame();
              endPlayGame();
          }
          
      }

      定義好該抽象類之后,我們再來定義具體模板實現(xiàn)類。這里定義兩個游戲類,一個是魂斗羅,一個忍者神龜。

      那么代碼如下:

      class ContraGame extends Game{   @Override   protected void runGame() {
             System.out.println("啟動魂斗羅II...");
         }   
      @Override   protected void startPlayGame() {
                System.out.println("1P正在使用S彈打aircraft...");
         }   
      @Override   protected void endPlayGame() {
                System.out.println("1P被流彈打死了,游戲結束!");
         }
      }
      class TMNTGame extends Game{
         @Override   protected void runGame() { 
               System.out.println("啟動忍者神龜III...");
         }   
         @Override   protected void choosePerson() {       System.out.println("1P選擇了Raph !");
         }   
         @Override   protected void startPlayGame() {
                System.out.println("Raph正在使用絕技 “火箭頭槌” ");
         }   
         @Override   protected void endPlayGame() {
                System.out.println("Raph 掉進井蓋里死了,游戲結束了! ");
         }
      }

      最后再來進行測試,測試代碼如下:

      public static void main(String[] args) {
             Game game = new ContraGame();
             game.play();
             System.out.println();
             game = new TMNTGame();
             game.play();
      
      }

      輸出結果:

      啟動魂斗羅II...1P正在使用S彈打aircraft...1P被流彈打死了,游戲結束!
      
      啟動忍者神龜III...1P選擇了Raph !
      Raph正在使用絕技 “火箭頭槌” 
      Raph 掉進井蓋里死了,游戲結束了!

      模板模式優(yōu)點:

      擴展性好,對不變的代碼進行封裝,對可變的進行擴展;
      可維護性好,因為將公共代碼進行了提取,使用的時候直接調(diào)用即可;

      模板模式缺點:

      因為每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導致類的個數(shù)增加,會使系統(tǒng)變得復雜;

      使用場景:

      有多個子類共有邏輯相同的方法;
      重要的、復雜的方法,可以考慮作為模板方法。

      注意事項:

      為防止惡意操作,一般模板方法都加上 final 關鍵詞!

      看完了這篇文章,相信你對Java中策略模式和模板方法模式的案例分析有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


      網(wǎng)頁題目:Java中策略模式和模板方法模式的案例分析-創(chuàng)新互聯(lián)
      路徑分享:http://www.ef60e0e.cn/article/iijoo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        清苑县| 西宁市| 义乌市| 资兴市| 安远县| 高淳县| 延庆县| 堆龙德庆县| 潜山县| 邵武市| 柏乡县| 新余市| 龙江县| 井陉县| 漠河县| 丘北县| 河南省| 彰武县| 湾仔区| 龙泉市| 玛多县| 阳山县| 津南区| 阿图什市| 永善县| 上杭县| 林甸县| 长阳| 许昌县| 牡丹江市| 香河县| 大悟县| 吴忠市| 洞口县| 曲水县| 巴彦县| 进贤县| 荣成市| 深圳市| 满洲里市| 营口市|