天天看點

設計模式(九)外觀模式

概念

外觀設計模式也稱作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一個外觀類實作計算機所有部件的控制,用戶端隻調用外觀類,實作了用戶端與子系統的解耦。

外觀模式的優缺點

  • 對客戶屏蔽了子系統元件,使客戶使用子系統更加友善;
  • 實作了子系統與客戶之間的松散耦合關系;
  • 如果需要也不限制使用子系統類

疑問:這個模式有點類似于網關,那麼如果門面角色類一旦挂掉了,不是會影響到所有的子系統的調用麼???

繼續閱讀