設計模式【9】-- 外觀模式?沒那麼高大上

秦怀杂货店發表於2022-01-07

1

開局一張圖,剩下全靠寫...

外觀模式是什麼

外觀模式,其實是用來隱藏系統的複雜性的,遮蔽掉了背後複雜的邏輯,向使用者提供簡單的可以訪問系統的介面,也是屬於結構型模式的一種 。

舉個例子,比如我們的Java 三層MVC架構,對外提供的是controller,但是controller內部可能呼叫了很多service,service又呼叫了一些mapper,反正就是內部很複雜,但是對外只是一個介面,一個門面,外部看起來是簡單的,外觀很好看,實際上,你都懂。

再舉個例子,我們用的電腦,其實內部也是極其複雜的,但是我們操作的時候,已經不管記憶體,cpu,磁碟,顯示卡這些怎麼工作了,甚至更加底層還有二進位制,硬體之類的,我們只需要開機,做我們想做的事情,比如Ctrl+C,Ctrl+V,在美麗漂亮的介面上操作就可以了。

外觀模式的角色

外觀模式主要包括幾個角色:

  • 外觀角色:糅合多個子系統功能,對外提供一個共同的介面
  • 子系統的角色:實現系統的部分功能
  • 客戶角色:通過外觀角色訪問各個子系統的功能

優點與缺點

優點:

  • 減少系統依賴,這裡指的是對外的系統依賴
  • 提高靈活性
  • 提高安全性

缺點:

  • 把東西糅合到一個人身上,帶來未知的風險
  • 增加新的子系統可能需要修改外觀類或者客戶端的原始碼,違反了“開閉原則”

測試例子

我們以電腦為例子,先給電腦的每個部件抽象定義成為一個元件,賦予一個work()的方法:

public interface Component {
    public void work();
}

再定義記憶體,磁碟,cpu三種不同元件,分別實現上面的介面,各自工作:

public class Disk implements Component{
    @Override
    public void work() {
        System.out.println("磁碟工作了...");
    }
}

public class CPU implements Component{
    @Override
    public void work() {
        System.out.println("CPU工作了...");
    }
}


public class Memory implements Component{
    @Override
    public void work() {
        System.out.println("記憶體工作了...");
    }
}

然後以上元件可能是交叉在一起工作的,我們模擬一下開機過程,作業系統分別呼叫他們:

public class OperationSystem {
    private Component disk;
    private Component memory;
    private Component CPU;

    public OperationSystem() {
        this.disk = new Disk();
        this.memory = new Memory();
        this.CPU = new CPU();
    }

    public void startingUp(){
        System.out.println("準備開機...");
        disk.work();
        memory.work();
        CPU.work();
    }
}

而使用人呼叫的其實是作業系統的開機啟動方法,不會直接呼叫到內部的方法,也就是遮蔽掉了所有的細節:

public class PersonTest {
    public static void main(String[] args) {
        OperationSystem operationSystem = new OperationSystem();
        operationSystem.startingUp();
    }
}

執行結果如下:

準備開機...
磁碟工作了...
記憶體工作了...
CPU工作了...

最後簡單小結一下,外觀模式,可以成為門面模式,也就是遮蔽掉內部細節,只對外提供介面,實現所需的功能,內部功能可能很複雜,以上我們模擬的只是簡單操作。學會了麼?

【作者簡介】
秦懷,公眾號【秦懷雜貨店】作者,個人網站:http://aphysia.cn,技術之路不在一時,山高水長,縱使緩慢,馳而不息。

劍指Offer全部題解PDF

開源程式設計筆記

相關文章