<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                10.4 模板方法模式的擴展 到目前為止,這兩個模型都穩定地運行,突然有一天,老大急匆匆地找到了我: “看你怎么設計的,車子一啟動,喇叭就狂響,吵死人了!客戶提出H1型號的悍馬喇叭想讓它響就響,H2型號的喇叭不要有聲音,趕快修改一下。” 自己惹的禍,就要想辦法解決它,稍稍思考一下,解決辦法有了,先畫出類圖,如圖10-4所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036193c36.jpg) 圖10-4 擴展悍馬車模類圖 類圖改動似乎很小,在抽象類HummerModel中增加了一個實現方法isAlarm,確定各個型號的悍馬是否需要聲音,由各個實現類覆寫該方法,同時其他的基本方法由于不需要對外提供訪問,因此也設計為protected類型。其源代碼如代碼清單10-9所示。 代碼清單10-9 擴展后的抽象模板類 public?abstract?class?HummerModel?{ ?????/* ??????*?首先,這個模型要能夠被發動起來,別管是手搖發動,還是電力發動,反正 ??????*?是要能夠發動起來,那這個實現要在實現類里了 ??????*/ ?????protected?abstract?void?start();??? ?????//能發動,還要能停下來,那才是真本事 ?????protected?abstract?void?stop();???? ?????//喇叭會出聲音,是滴滴叫,還是嗶嗶叫 ?????protected?abstract?void?alarm();??? ?????//引擎會轟隆隆的響,不響那是假的 ?????protected?abstract?void?engineBoom();?????? ?????//那模型應該會跑吧,別管是人推的,還是電力驅動,總之要會跑 ?????final?public?void?run()?{?????????? ?????????????//先發動汽車 ?????????????this.start();?????????????? ?????????????//引擎開始轟鳴 ?????????????this.engineBoom();????????? ?????????????//要讓它叫的就是就叫,喇嘛不想讓它響就不響 ?????????????if(this.isAlarm()){ ??????????????????????this.alarm(); ?????????????} ?????????????//到達目的地就停車 ?????????????this.stop(); ?????}?? ?????//鉤子方法,默認喇叭是會響的 ?????protected??boolean?isAlarm(){ ?????????????return?true; ?????} } 在抽象類中,isAlarm是一個實現方法。其作用是模板方法根據其返回值決定是否要響喇叭,子類可以覆寫該返回值,由于H1型號的喇叭是想讓它響就響,不想讓它響就不響,由人控制,其源代碼如代碼清單10-10所示。 代碼清單10-10 擴展后的H1悍馬 public?class?HummerH1Model?extends?HummerModel?{ ?????private?boolean?alarmFlag?=?true;??//要響喇叭 ?????protected?void?alarm()?{ ?????????????System.out.println("悍馬H1鳴笛..."); ?????} ?????protected?void?engineBoom()?{ ?????????????System.out.println("悍馬H1引擎聲音是這樣的..."); ?????} ?????protected?void?start()?{ ?????????????System.out.println("悍馬H1發動..."); ?????} ?????protected?void?stop()?{ ?????????????System.out.println("悍馬H1停車..."); ?????} ?????protected?boolean?isAlarm()?{ ?????????????return?this.alarmFlag; ?????} ?????//要不要響喇叭,是由客戶來決定的 ?????public?void?setAlarm(boolean?isAlarm){ ?????????????this.alarmFlag?=?isAlarm; ?????} } 只要調用H1型號的悍馬,默認是有喇叭響的,當然你可以不讓喇叭響,通過isAlarm(false)就可以實現。H2型號的悍馬是沒有喇叭聲響的,其源代碼如代碼清單10-11所示。 代碼清單10-11 擴展后的H2悍馬 public?class?HummerH2Model?extends?HummerModel?{ ?????protected?void?alarm()?{ ?????????????System.out.println("悍馬H2鳴笛..."); ?????} ?????protected?void?engineBoom()?{ ?????????????System.out.println("悍馬H2引擎聲音是這樣的..."); ?????} ?????protected?void?start()?{ ?????????????System.out.println("悍馬H2發動..."); ?????} ?????protected?void?stop()?{ ?????????????System.out.println("悍馬H2停車..."); ?????} ?????//默認沒有喇叭的 ?????protected?boolean?isAlarm()?{ ?????????????return?false; ?????} } H2型號的悍馬設置isAlarm()的返回值為false,也就是關閉了喇叭功能。場景類代碼如代碼清單10-12所示。 代碼清單10-12 擴展后的場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?throws?IOException?{ ?????????????System.out.println("-------H1型號悍馬--------"); ?????????????System.out.println("H1型號的悍馬是否需要喇叭聲響?0-不需要???1-需要"); ?????????????String?type=(new?BufferedReader(new?InputStreamReader(System.in))).readLine(); ?????????????HummerH1Model?h1?=?new?HummerH1Model(); ?????????????if(type.equals("0")){?? ?????????????????????h1.setAlarm(false); ?????????????} ?????????????h1.run(); ?????????????System.out.println("\n-------H2型號悍馬--------"); ?????????????HummerH2Model?h2?=?new?HummerH2Model(); ?????????????h2.run(); ?????} } 運行是需要交互的,首先,要求輸入H1型號的悍馬是否有聲音,如下所示: -------H1型號悍馬-------- H1型號的悍馬是否需要喇叭聲響?0-不需要 1-需要 輸入“0”后的運行結果如下所示: -------H1型號悍馬-------- H1型號的悍馬是否需要喇叭聲響?0-不需要 1-需要 0 悍馬H1發動... 悍馬H1引擎聲音是這樣的... 悍馬H1停車... -------H2型號悍馬-------- 悍馬H2發動... 悍馬H2引擎聲音是這樣的... 悍馬H2停車... 輸入“1”后的運行結果如下所示: -------H1型號悍馬-------- H1型號的悍馬是否需要喇叭聲響?0-不需要 1-需要 1 悍馬H1發動... 悍馬H1引擎聲音是這樣的... 悍馬H1鳴笛... 悍馬H1停車... -------H2型號悍馬-------- 悍馬H2發動... 悍馬H2引擎聲音是這樣的... 悍馬H2停車... 看到沒,H1型號的悍馬是由客戶自己控制是否要響喇叭,也就是說外界條件改變,影響到模板方法的執行。在我們的抽象類中isAlarm的返回值就是影響了模板方法的執行結果,該方法就叫做鉤子方法(Hook Method)。有了鉤子方法模板方法模式才算完美,大家可以想想,由子類的一個方法返回值決定公共部分的執行結果,是不是很有吸引力呀! 模板方法模式就是在模板方法中按照一定的規則和順序調用基本方法,具體到前面那個例子,就是run()方法按照規定的順序(先調用start(),然后再調用engineBoom(),再調用alarm(),最后調用stop())調用本類的其他方法,并且由isAlarm()方法的返回值確定run()中的執行順序變更。
                  <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>

                              哎呀哎呀视频在线观看