<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之旅 廣告
                第10章 模板方法模式 10.1 輝煌工程——制造悍馬 周三,9:00,我剛剛坐到位置上,打開電腦準備開始干活。 “小三,小三,叫一下其他同事,到會議室開會”,老大跑過來吼,帶著壞笑。還沒等大家坐穩,老大就開講了: “告訴大家一個好消息,昨天終于把××模型公司的口子打開了,要我們做悍馬模型,雖然是第一個車輛模型,但是我們有能力、有信心做好,我們一定要……”(中間省略20分鐘的講話,如果你聽過領導人的講話,這個你應該能夠續上) 動員工作做完了,那就開始壓任務了。“這次時間是非常緊張的,只有一個星期的時間,小三,你負責在一個星期的時間把這批10萬車模(注:車模是車輛模型的意思,不是香車美女那個車模)建設完成……” “一個星期?這個……是真做不完,要做分析,做模板,做測試,還要考慮擴展性、穩定性、健壯性等,時間實在是太少了。”還沒等老大說完,我就急了,再不急我的小命就折在上面了! “那這樣,只做最基本的實現,不考慮太多的問題,怎么樣?”老大又把我彈回去了。 “只作基本實現?那……” 唉,領導已經布置任務了,那就開始拼命地做吧。然后就開始準備動手做,在做之前先介紹一下我們公司的背景,我們公司是做模型生產的,做過橋梁模型、建筑模型、機械模型,甚至是一些政府、軍事的機密模型,這個不能細說,絕密。公司的主要業務就是把實物按照一定的比例縮小或放大,用于試驗、分析、量化或者是銷售,等等,上面提到的××模型公司是專門銷售車輛模型的公司,自己沒有生產企業,全部是代工。我們公司是第一次從××模型公司接單,那我怎么著也要把活干好,可時間有限,任務量又巨大,怎么辦? 既然領導都說了,不考慮擴展性,那好辦,先按照最一般的經驗設計類圖,如圖10-1所示。 ![](https://box.kancloud.cn/2016-08-14_57b003614c644.jpg) 圖10-1 悍馬車模型最一般的類圖 非常簡單的實現,悍馬車有兩個型號,H1和H2。按照需求,只需要悍馬模型,那好我就給你悍馬模型,先寫個抽象類,然后兩個不同型號的模型實現類,通過簡單的繼承就可以實現業務要求。我們先從抽象類開始編寫,抽象悍馬模型如代碼清單10-1所示。 代碼清單10-1 抽象悍馬模型 public?abstract?class?HummerModel?{ ?????/* ??????*?首先,這個模型要能夠被發動起來,別管是手搖發動,還是電力發動,反正 ??????*?是要能夠發動起來,那這個實現要在實現類里了 ??????*/ ?????public?abstract?void?start(); ?????//能發動,還要能停下來,那才是真本事 ?????public?abstract?void?stop();??????? ?????//喇叭會出聲音,是滴滴叫,還是嗶嗶叫 ?????public?abstract?void?alarm(); ?????//引擎會轟隆隆地響,不響那是假的 ?????public?abstract?void?engineBoom(); ?????//那模型應該會跑吧,別管是人推的,還是電力驅動的,總之要會跑 ?????public?abstract?void?run(); } 在抽象類中,我們定義了悍馬模型都必須具有的特質:能夠發動、停止,喇叭會響,引擎可以轟鳴,而且還可以停止。但是每個型號的悍馬實現是不同的,H1型號的悍馬如代碼清單10-2所示。 代碼清單10-2 H1型號悍馬模型 public?class?HummerH1Model?extends?HummerModel?{ ?????//H1型號的悍馬車鳴笛 ?????public?void?alarm()?{ ?????????????System.out.println("悍馬H1鳴笛..."); ?????} ?????//引擎轟鳴聲 ?????public?void?engineBoom()?{ ?????????????System.out.println("悍馬H1引擎聲音是這樣的..."); ?????} ?????//汽車發動 ?????public?void?start()?{ ?????????????System.out.println("悍馬H1發動..."); ?????}?? ?????//停車 ?????public?void?stop()?{ ?????????????System.out.println("悍馬H1停車..."); ?????} ?????//開動起來 ?????public?void?run(){ ?????????????//先發動汽車 ?????????????this.start(); ?????????????//引擎開始轟鳴 ?????????????this.engineBoom(); ?????????????//然后就開始跑了,跑的過程中遇到一條狗擋路,就按喇叭 ?????????????this.alarm(); ?????????????//到達目的地就停車 ?????????????this.stop(); ?????} } 大家注意看run()方法,這是一個匯總的方法,一個模型生產成功了,總要拿給客戶檢測吧,怎么檢測?“是騾子是馬,拉出去溜溜”,這就是一種檢驗方法,讓它跑起來!通過run()這樣的方法,把模型的所有功能都測試到了。 H2型號悍馬如代碼清單10-3所示。 代碼清單10-3 H2型號悍馬模型 public?class?HummerH2Model?extends?HummerModel?{ ?????//H2型號的悍馬車鳴笛 ?????public?void?alarm()?{ ?????????????System.out.println("悍馬H2鳴笛..."); ?????} ?????//引擎轟鳴聲 ?????public?void?engineBoom()?{ ?????????????System.out.println("悍馬H2引擎聲音是這樣在..."); ?????} ?????//汽車發動 ?????public?void?start()?{ ?????????????System.out.println("悍馬H2發動..."); ?????}?? ?????//停車 ?????public?void?stop()?{ ?????????????System.out.println("悍馬H2停車..."); ?????}?? ?????//開動起來 ?????public?void?run(){ ?????????????//先發動汽車 ?????????????this.start();?????????????? ?????????????//引擎開始轟鳴 ?????????????this.engineBoom();????????? ?????????????//然后就開始跑了,跑的過程中遇到一條狗擋路,就按喇叭 ?????????????this.alarm();?????????????? ?????????????//到達目的地就停車 ?????????????this.stop(); ?????} } 好了,程序編寫到這里,已經發現問題了,兩個實現類的run()方法都是完全相同的,那這個run()方法的實現應該出現在抽象類,不應該在實現類上,抽象是所有子類的共性封裝。 注意 在軟件開發過程中,如果相同的一段代碼復制過兩次,就需要對設計產生懷疑,架構師要明確地說明為什么相同的邏輯要出現兩次或更多次。 好,問題發現了,我們就需要馬上更改,修改后的類圖如圖10-2所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036161d71.jpg) 圖10-2 修改后的悍馬車模類圖 注意,抽象類HummerModel中的run()方法,由抽象方法變更為實現方法,其源代碼如代碼清單10-4所示。 代碼清單10-4 修改后的抽象悍馬模型 public?abstract?class?HummerModel?{ ?????/* ??????*?首先,這個模型要能發動起來,別管是手搖發動,還是電力發動,反正 ??????*?是要能夠發動起來,那這個實現要在實現類里了 ??????*/ ?????public?abstract?void?start();?????? ?????//能發動,還要能停下來,那才是真本事 ?????public?abstract?void?stop();??????? ?????//喇叭會出聲音,是滴滴叫,還是嗶嗶叫 ?????public?abstract?void?alarm();?????? ?????//引擎會轟隆隆地響,不響那是假的 ?????public?abstract?void?engineBoom();? ?????//那模型應該會跑吧,別管是人推的,還是電力驅動,總之要會跑 ?????public?void?run(){ ?????????????//先發動汽車 ?????????????this.start();?????????????? ?????????????//引擎開始轟鳴 ?????????????this.engineBoom();????????? ?????????????//然后就開始跑了,跑的過程中遇到一條狗擋路,就按喇叭 ?????????????this.alarm();?????????????? ?????????????//到達目的地就停車 ?????????????this.stop(); ?????} } 在抽象的悍馬模型上已經定義了run()方法的執行規則,先啟動,然后引擎立刻轟鳴,中間還要按一下喇叭,制造點噪聲(要不就不是名車了)。然后停車,它的兩個具體實現類就不需要實現run()方法了,只要把代碼清單10-2、代碼清單10-3上的run()方法刪除即可,不再贅述代碼。 場景類實現的任務就是把生產出的模型展現給客戶,其源代碼如代碼清單10-5所示。 代碼清單10-5 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//XX公司要H1型號的悍馬 ?????????????HummerModel?h1?=?new?HummerH1Model();?????????????? ?????????????//H1模型演示 ?????????????h1.run(); ?????} } 運行結果如下所示。 悍馬H1發動... 悍馬H1引擎聲音是這樣的... 悍馬H1鳴笛... 悍馬H1停車... 目前客戶只要看H1型號的悍馬車,沒問題,生產出來,同時可以運行起來給他看看。非常簡單,那如果我告訴你這就是模板方法模式你會不會很不屑呢?就這模式,太簡單了,我一直在使用呀!是的,你經常在使用,但你不知道這是模板方法模式,那些所謂的高手就可以很牛地說:“用模板方法模式就可以實現”,你還要很崇拜地看著,哇,牛人,模板方法模式是什么呀?這就是模板方法模式。
                  <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>

                              哎呀哎呀视频在线观看