- 一文帶你搞懂Java動態代理
- 幾分鐘帶你搞懂策略模式
- 幾分鐘帶你搞懂觀察者模式
- 一文徹底搞明白工廠和抽象工廠
- 一文搞明白裝飾者模式
- 最全單例模式
- 幾段代碼搞明白命令模式
- 幾段代碼搞明白適配器模式
- 一看就懂的外觀模式
關於外觀模式的定義,我就直接引用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();
}
}