模版模式,給相似的,或者使用同一工做流程的產品定義一個模版,儘可能減小程序修改時候的成本。ide
咱們直接使用路虎的例子。如今須要給路虎汽車定義一個模版,可以包含基本的行爲和行駛的工做流程。函數
總體類圖以下:this
汽車的一系列動做能夠歸納成:啓動汽車,發動機運行,鳴笛,停車。這四個方法是全部汽車都要進行的工做,因此在抽象類中實現。假設全部的汽車都要走這個麼流程的,則能夠直接在抽象類中實現這些方法調用的封裝。啓動到停車這幾個方法無需對用戶可見,則定義爲protected便可,run函數將會被調用,但不會被改變,因此,定義爲final,spa
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. Hummer Model是悍馬車輛模型的意思,不是悍馬美女車模 */ public abstract class HummerModel { /* * 首先,這個模型要可以被髮動起來,別管是手搖發動,仍是電力發動,反正 是要可以發動起來,那這個實現要在實現類裏了 */ protected abstract void start(); // 能發動,那還要能停下來,那纔是真本事 protected abstract void stop(); // 喇叭會出聲音,是滴滴叫,仍是嗶嗶叫 protected abstract void alarm(); // 引擎會轟隆隆的響,不響那是假的 protected abstract void engineBoom(); // 鉤子方法,默認喇叭是會響的,子類中能夠重載修改 protected boolean isAlarm() { return true; } // 那模型應該會跑吧,別管是人退的,仍是電力驅動,總之要會跑 final public void run() { // 先發動汽車 this.start(); // 引擎開始轟鳴 this.engineBoom(); // 喇嘛想讓它響就響,不想讓它響就不響 if (this.isAlarm()) { this.alarm(); } // 到達目的地就停車 this.stop(); } }
H1型號的汽車是H1的特徵,對這是個protected方法進行實現:3d
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 悍馬車是每一個越野者的最愛,其中H1最接近軍用系列 */ public class HummerH1Model extends HummerModel { @Override public void alarm() { System.out.println("悍馬H1鳴笛..."); } @Override public void engineBoom() { System.out.println("悍馬H1引擎聲音是這樣在..."); } @Override public void start() { System.out.println("悍馬H1發動..."); } @Override public void stop() { System.out.println("悍馬H1停車..."); } }
H2型號的汽車:code
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. H1和H2有什麼差異,還真不知道,真沒接觸過悍馬 */ public class HummerH2Model extends HummerModel { @Override public void alarm() { System.out.println("悍馬H2鳴笛..."); } @Override public void engineBoom() { System.out.println("悍馬H2引擎聲音是這樣在..."); } @Override public void start() { System.out.println("悍馬H2發動..."); } @Override public void stop() { System.out.println("悍馬H1停車..."); } //H2車型默認的喇叭函數與其餘車型不一樣,因此這裏只需重載 @Override protected boolean isAlarm() { return false; } }
Client的實現:blog
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 客戶開始使用這個模型 */ public class Client { public static void main(String[] args) { // 客戶開着H1型號,出去遛彎了 HummerModel h1 = new HummerH1Model(); h1.run(); // 汽車跑起來了; // 客戶開H2型號,出去玩耍了 HummerModel h2 = new HummerH2Model(); h2.run(); } }