<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                英文名稱:Template Method Pattern。 **定義**:定義一個操作中的算法的框架,而將一些步驟延遲到子類中,是的子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 **我的理解**:模板方法模式在編程中常常用到,例如Android開發中創建Activity我們繼承Activity,需要重寫onCreat()方法和其他固定的方法一樣,這就是模板方法模式的應用。他首先要定義一個接口或者類,提供一些方法框架,使用子類去繼承這些類,并實現這些方法,是的該方法的具體實現在子類中提供。 **一個例子:** 一個車輛模型定義它的start(),stop(),alarm(),engineBoom(),run()等方法。 不同的車輛都要遵守這個接口,并實現其特有的方法。 定義一個BMWModel類和BenzModel類來實現這個接口,并提供特有的方法。 ![](https://box.kancloud.cn/2016-06-06_57553408beff8.jpg) ~~~ public class TemplateMethodTest { public static void main(String[] args) { System.out.println("------奔馳車模板----------"); Model benz = new BenzModel(); benz.run(); System.out.println("------寶馬車模板----------"); Model bmw = new BMWModel(); bmw.run(); } } abstract class Model{ //車輛啟動 protected abstract void start(); //車輛停止 protected abstract void stop(); //車輛鳴笛 protected abstract void alarm(); //車輛發動機轟鳴 protected abstract void engineBoom(); protected void run(){ this.engineBoom(); this.start(); this.alarm(); this.stop(); } } class BMWModel extends Model{ @Override protected void start() { System.out.println("寶馬車啟動..."); } @Override protected void stop() { System.out.println("寶馬車停止..."); } @Override protected void alarm() { System.out.println("寶馬車開始鳴笛..."); } @Override protected void engineBoom() { System.out.println("寶馬車發動機轟鳴..."); } } class BenzModel extends Model{ @Override protected void start() { System.out.println("奔馳啟動..."); } @Override protected void stop() { System.out.println("奔馳停止..."); } @Override protected void alarm() { System.out.println("奔馳開始鳴笛..."); } @Override protected void engineBoom() { System.out.println("奔馳發動機轟鳴..."); } } ~~~ **模板方法模式的應用場景:** 1、多個子類有共有的方法,并且邏輯基本相同 2、重要復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節功能則由各個子類實現 3、重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數約束其行為 **模板方法模式的擴展: 1、鉤子函數約束子類的行為。 案例擴展:** 老板要求讓用戶自己設置汽車的鳴笛時間。 那么就需要定義一個isAlarm方法讓用戶去設置是否鳴笛。從而約束其方法的執行。 ~~~ public class TemplateMethodTest { public static void main(String[] args) { System.out.println("------奔馳車模板----------"); System.out.println("用戶設置車輛是否鳴笛,1表示可以鳴笛,2表示不可以鳴笛."); BenzModel benz = new BenzModel(); Scanner input = new Scanner(System.in); String type = input.next(); if(type.equals("1")){ benz.setAlarm(true); }else if(type.equals("2")){ benz.setAlarm(false); }else{ System.out.println("無效的輸入!"); return; } benz.run(); } } abstract class Model{ //車輛啟動 protected abstract void start(); //車輛停止 protected abstract void stop(); //車輛鳴笛 protected abstract void alarm(); //車輛發動機轟鳴 protected abstract void engineBoom(); protected void run(){ this.engineBoom(); this.start(); //如果isAlarm為true,就執行鳴笛方法。 if(isAlarm()) this.alarm(); this.stop(); } //用isAlarm設置是否需要鳴笛,默認可以鳴笛。 protected boolean isAlarm(){ return true; } } class BMWModel extends Model{ private boolean flag = true; public void setAlarm(boolean flag){ this.flag = flag; } protected boolean isAlarm() { return flag; } @Override protected void start() { System.out.println("寶馬車啟動..."); } @Override protected void stop() { System.out.println("寶馬車停止..."); } @Override protected void alarm() { System.out.println("寶馬車開始鳴笛..."); } @Override protected void engineBoom() { System.out.println("寶馬車發動機轟鳴..."); } } class BenzModel extends Model{ private boolean flag = true; public void setAlarm(boolean flag){ this.flag = flag; } protected boolean isAlarm() { return flag; } @Override protected void start() { System.out.println("奔馳啟動..."); } @Override public void stop() { System.out.println("奔馳停止..."); } @Override public void alarm() { System.out.println("奔馳開始鳴笛..."); } @Override public void engineBoom() { System.out.println("奔馳發動機轟鳴..."); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看