設計模式(八)一看就懂的外觀模式

關於外觀模式的定義,我就直接引用Head First了:外觀模式提供了一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高級接口,讓子系統更容易使用。聽起來很抽象,其實外觀模式的本質就是使用組合的方式,來管理一個子系統內的一羣對象,它的意圖即提供一個接口,好讓一個子系統更易於使用。

外觀模式

假如廠商提供了一組智能設備,並對外公開了如下接口,方便用戶遠程控制:
在這裏插入圖片描述
這是智能燈類

public class Light {
    public void on() {
        System.out.println("開燈");
    }
    public void off() {
        System.out.println("關燈");
    }
}

這是智能空調類

public class AirConditioner {
    public void on() {
        System.out.println("打開空調");
    }
    public void adjustTemperature() {
        System.out.println("調節溫度");
    }
    public void off() {
        System.out.println("關閉空調");
    }
}

這是智能熱水器類

public class Heater {
    public void on() {
        System.out.println("打開熱水器蓄水加熱");
    }
    public void adjustTemperature() {
        System.out.println("調節溫度");
    }
    public void off() {
        System.out.println("關閉熱水器");
    }
}

正常情況下,用戶類回到家中,可能都需要進行如下操作,見下:

public class ClientTest {
    private static Light mLight;
    private static AirConditioner mAc;
    private static Heater mHeater;

    public ClientTest(Light light, AirConditioner ac
            , Heater heater) {
        this.mLight = light;
        this.mAc = ac;
        this.mHeater = heater;
    }

    public static void main(String[] ags) {
        /**
         * 對用戶來說,需要進行一系列操作,是不是特別繁瑣。
         * <ul>
         * <li>打開燈光
         * <li>打開空調
         * <li>調節室內溫度
         * <li>打開熱水器準備熱水
         * <li>調節水溫
         * </ul>
         */
        mLight.on();
        mAc.on();
        mAc.adjustTemperature();
        mHeater.on();
        mHeater.adjustTemperature();
    }
}

這對於用戶來說就顯得非常繁瑣不友好了。外觀模式正是在這種情況下應運而生的。外觀對用戶提供簡化的接口,將用戶類與具體的智能設備類解耦。我們來創建一個外觀類

public class HardwareFacade {
    private Light mLight;
    private AirConditioner mAc;
    private Heater mHeater;

    public HardwareFacade(Light light, AirConditioner ac
            , Heater heater) {
        this.mLight = light;
        this.mAc = ac;
        this.mHeater = heater;
    }

    /**
     * 爲智能硬件這個子系統提供一個簡單接口。
     * 
     * <p>用戶到家只需要調用這一個請求,
     * 就可以享受有燈、有水、涼颼颼。
     */
     public void openAppliance() {
        mLight.on();
        mAc.on();
        mAc.adjustTemperature();
        mHeater.on();
        mHeater.adjustTemperature();
     }
}

用戶只需與我們的外觀類HardwareFacade進行交互即可,這大大簡化了用戶的操作。外觀類通過組合的方式實現了對智能硬件這個子系統的管理,讓智能硬件與用戶實現瞭解耦。當然這並不影響用戶單獨對於具體智能硬件類的使用,即外觀提供簡單接口的同時,依然將系統完整的功能暴露出來,以供用戶需要時使用。再來看下用戶類的調用代碼:

public class ClientTest {
     public static void main(String[] ags) {
         HardwareFacade facade = new HardwareFacade(light, ac, heater);
         facade.openAppliance();
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章