模版模式

      模版模式,給相似的,或者使用同一工做流程的產品定義一個模版,儘可能減小程序修改時候的成本。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();
    }
}
View Code

      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停車...");
    }
}
View Code

      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;
    }
}
View Code

      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();
    }
}
View Code
相關文章
相關標籤/搜索