外觀模式(Facade),又稱爲門面模式,是一種比較簡單又非常常用的設計模式
目錄
模式定義
爲子系統中的一組接口提供一個統一的入口。外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
類圖
參與者
Facade門面角色
客戶端可以調用這個角色的方法。此角色知曉子系統的所有功能和責任。一般情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統去,也就說該角色沒有實際的業務邏輯,只是一個委託類。
subsystem
子系統角色可以同時有一個或者多個子系統。每一個子系統都不是一個單獨的類,而是一個類的集合。子系統並不知道門面的存在。對於子系統而言,門面僅僅是另外一個客戶端而已。
例子
一個保安系統的,由錄像機、電燈、紅外線監控和警報器組成。保安系統的操作人員需要經常將這些儀器啓動和關閉。保安類需要用到所有的錄像機(Camera)、電燈(Light)、感應器(Sensor)和警報器(Alarm)對象,保安覺得使用不方便。應用外觀模式,用控制檯應用程序改進該設計。繪製該模式的UML圖。
//定義一個設備接口
public interface Equipment {
public void turnOn(); // 打開設備
public void turnOff(); // 關閉設備
}
public class Camera implements Equipment {
public void turnOn() {
System.out.println("打開錄像機");
}
public void turnOff() {
System.out.println("關閉錄像機");
}
}
public class Light implements Equipment {
public void turnOn() {
System.out.println("打開電燈");
}
public void turnOff() {
System.out.println("關閉電燈");
}
}
public class Sensor implements Equipment {
@Override
public void turnOn() {
System.out.println("打開傳感器");
}
@Override
public void turnOff() {
System.out.println("關閉傳感器");
}
}
public class Alarm implements Equipment {
@Override
public void turnOn() {
System.out.println("打開警報器");
}
@Override
public void turnOff() {
System.out.println("關閉警報器");
}
}
public class Console {
private Equipment camera = new Camera();
private Equipment light = new Light();
private Equipment sensor = new Sensor();
private Equipment alarm = new Alarm();
public void turnOnAll() {
camera.turnOn();
light.turnOn();
sensor.turnOn();
alarm.turnOn();
}
public void turnOffAll() {
camera.turnOff();
light.turnOff();
sensor.turnOff();
alarm.turnOff();
}
}
public class Cline {
public static void main(String[] args) {
Console console = new Console();
console.turnOnAll();
console.turnOffAll();
}
}
通過一個Console的門面類,控制子系統的功能