設計模式,結構模式之外觀模式

1 概述

外觀模式,也叫門面模式,是一種常見結構模式,它是面向對象設計封裝思想的體現。

2 外觀模式

所謂外觀,其實是一個額外的類,它包含了複雜多變的子系統,並只對外提供簡單的接口。相比於子系統,外觀類提供的功能有限,因爲它只包含外界真正關心的功能。
比如汽車只提供「方向盤」,「油門」,「剎車」幾個簡單元件供人使用,我們並不關心,也不需要關心發動機,剎車片是如何工作的。這裏的汽車就是外觀,而發動機剎車片,就是底層元件。
當實現某個功能需要多個模塊集成在一起時,外觀模式可以化繁爲簡,降低客戶端(Client)與應用程序的耦合度。

3 案例

拿電腦舉例子,我們按一下電腦的電源鍵,就可以啓動電腦的各個部件。電腦其實就是一個外觀類。

public class Test {
    public static void main(String[] args) {
        Computer facade = new Computer();
        // 使用外觀類控制啓動
        facade.startup();
        // 使用外觀類控制關閉
        facade.shutdown();
    }
}

public class Computer {
    // 外觀類持有模塊對象
    ElectronicComponent motherboard = new Motherboard();
    ElectronicComponent cpu = new CPU();
    ElectronicComponent memory = new Memory();

    // 調用各個模塊的相應方法
    public void startup() {
        motherboard.start();
        cpu.start();
        memory.start();
        System.out.println("Computer started!");
    }

    // 調用各個模塊的相應方法
    public void shutdown() {
        motherboard.stop();
        cpu.stop();
        memory.stop();
        System.out.println("Computer has been shut down.");
    }
}

public interface ElectronicComponent {
    void start();
    void stop();
}

public class Motherboard implements ElectronicComponent {
    @Override
    public void start() { System.out.println("Motherboard is starting up"); }
    @Override
    public void stop() { System.out.println("Motherboard is shutting down..."); }
}

public class CPU implements ElectronicComponent {
    @Override
    public void start() { System.out.println("CPU is starting up..."); }
    @Override
    public void stop() { System.out.println("CPU is shutting down..."); }
}

public class Memory implements ElectronicComponent {
    @Override
    public void start() { System.out.println("Memory is starting up..."); }
    @Override
    public void stop() { System.out.println("Memory is shutting down..."); }
}

輸出:

Motherboard is starting up
CPU is starting up...
Memory is starting up...
Computer started!
Motherboard is shutting down...
CPU is shutting down...
Memory is shutting down...
Computer has been shut down.

uml

外觀對象電腦將複雜的一系列操作只封裝爲兩個簡單的方法startupshutdown,方便了客戶端(調用者)的使用。同時客戶端只需要依賴於外觀對象,而不必與主板內存這些底層模塊耦合,大大提高了代碼的可維護性。

4 總結

當遇到多個不同的模塊(接口)需要一起工作來完成某個功能時,可以考慮使用外觀模式來降低系統複雜度。

文中例子的github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章