概念
外觀設計模式也稱作facade模式,用來給子系統的一組接口提供統一接口,作為一種結構型模式,主要解決用戶端群組件中的子系統有過多的耦合問題。外觀模式對子系統提供了一個更高層次,更簡單的接口,進而降低了子系統的複雜度和依賴,外觀對象隔離了子系統和用戶端,進而降低了耦合。
模式結構
外觀模式角色結構
- 門面角色(facade):外觀模式的核心,被客戶調用,熟悉子系統的功能;
- 子系統角色:實作子系統的功能,對facade角色未知;
- 客戶角色:調用facade角色完成需要的功能。
示例說明
/**
* 門面角色
*/
public class Computer {
private CPU cpu;
private Disk disk;
private Memory memory;
public Computer() {
this.cpu = new CPU();
this.disk = new Disk();
this.memory = new Memory();
}
public void startup(){
System.out.println("啟動電腦開始");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("啟動電腦完成");
}
public void shutdown(){
System.out.println("關閉電腦開始");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("關閉電腦完成");
}
}
/**
* 子系統角色1
*/
class CPU{
public void startup(){
System.out.println("啟動CPU");
}
public void shutdown(){
System.out.println("關閉CPU");
}
}
/**
* 子系統角色2
*/
class Memory{
public void startup(){
System.out.println("加載記憶體");
}
public void shutdown(){
System.out.println("清空記憶體");
}
}
/**
* 子系統角色3
*/
class Disk{
public void startup(){
System.out.println("加載硬碟");
}
public void shutdown(){
System.out.println("解除安裝硬碟");
}
}
/**
* 客戶
*/
class ComputerClient{
public static void main(String[] args){
Computer computer = new Computer();
computer.startup();
System.out.println("===================================");
computer.shutdown();
}
}
運作結果:
啟動電腦開始
啟動CPU
加載記憶體
加載硬碟
啟動電腦完成
===================================
關閉電腦開始
關閉CPU
清空記憶體
解除安裝硬碟
關閉電腦完成
通過Computer一個外觀類實作計算機所有部件的控制,用戶端隻調用外觀類,實作了用戶端與子系統的解耦。
外觀模式的優缺點
- 對客戶屏蔽了子系統元件,使客戶使用子系統更加友善;
- 實作了子系統與客戶之間的松散耦合關系;
- 如果需要也不限制使用子系統類
疑問:這個模式有點類似于網關,那麼如果門面角色類一旦挂掉了,不是會影響到所有的子系統的調用麼???