【設計模式系列15】設計模式並沒有想象中的那麼高深,不信你進來看看門面模式就知道了

2020-10-02 11:00:18

前言

提到設計模式,可能有的人就會覺得很抽象,很高深的樣子,其實設計模式並沒有想象中的那麼高深,很多設計模式我們天天都在用,只是自己不知道自己用到的就是設計模式而已。設計模式也是在開發的基礎上總結歸納得出來的,並不是什麼新穎的東西,只是一種經驗的總結而已,如果有覺得設計模式高深莫測的朋友,那麼看看這篇門面模式我想一定會改變你的觀點,門面模式會讓你發出「這也是設計模式?」的感慨。

什麼是門面模式

門面模式(Facade Pattern),又被稱之為外觀模式。門面模式提供了一個統一的介面,這個介面可以用來存取相同子系統或者不同子系統之中的一群介面。門面模式使得系統更加容易呼叫,屬於結構型模式。

門面模式角色

門面模式主要包含了兩種角色:

  • 外觀角色(Facade):也稱門面角色,系統對外統一介面。
  • 子系統角色(SubSystem):可以同時有一個或者多個SubSystem。每個SubSystem都不是一個單獨的類,而是一個類的集合。SubSystem並不知道Facade的存在,對於SubSystem而言,Facade也僅僅只是一個呼叫者(使用者端)而已。

門面模式範例

好了,裝逼時刻又到了:Talk is cheap,Show you the code,先看一個非常簡單的例子。

1、新建2個子系統角色類,每個類中都只有一個方法:

package com.zwx.design.pattern.facade;

public class SubSystemA {
    public void doSomething(){
        System.out.println("I'm A");
    }
}
package com.zwx.design.pattern.facade;

public class SubSystemB {
    public void doSomething(){
        System.out.println("I'm B");
    }
}

2、新建一個門面類來統一提供對外呼叫子系統介面的方法:

package com.zwx.design.pattern.facade;

public class SimpleFacade {
    private SubSystemA systemA = new SubSystemA();
    private SubSystemB systemB = new SubSystemB();

    public void doA(){
        this.systemA.doSomething();
    }
    public void doB(){
        this.systemB.doSomething();
    }
}

3、最後新建測試類:

package com.zwx.design.pattern.facade;

public class TestSimpleFacade {
    public static void main(String[] args) {
        SimpleFacade simpleFacade = new SimpleFacade();
        simpleFacade.doA();
        simpleFacade.doB();
    }
}

測試類中不會直接呼叫子系統,而是通過門面類來進行統一呼叫。

看完這個例子,大家應該會發出感慨了,這種方式我們天天都在用,原來居然就是設計模式之一的門面模式。

還有另一種寫法就是假如我們一個流程裡面需要很多個子系統的方法一起呼叫才能完成,那麼這時候我們就可以對上面的範例進行改造了,如下我們再新建一個門面類:

package com.zwx.design.pattern.facade;

public class Facade {
    private SubSystemA systemA = new SubSystemA();
    private SubSystemB systemB = new SubSystemB();
    
    public void doAB(){
        this.systemA.doSomething();
        this.systemB.doSomething();
    }
}

然後測試類中就可以直接通過呼叫一個方法達到呼叫多個子系統的方法完成一個流程:

package com.zwx.design.pattern.facade;

public class TestFacade {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doAB();
    }
}

門面模式應用場景

門面模式一般可以適用於以下兩種場景:
1、當各個子系統越來越複雜時,可以提供門面介面來統一呼叫
2、構建多層系統結構時,利用門面物件來作為每層的入口,這樣可以簡化分層間的介面呼叫

門面模式優缺點

優點:

  • 1、簡化了呼叫過程,呼叫者無需深入瞭解子系統,以防給子系統帶來風險
  • 2、減少了系統間的依賴,鬆散了耦合度
  • 3、將系統劃分了層次,提高了安全性
  • 4、遵循了迪米特法則(即最少知道原則)

缺點:

  • 1、當增加子系統或者擴充套件子系統功能時,可能容易帶來未知風險
  • 2、不符合開閉原則
  • 3、某些情況下可能會違背單一職責原則

總結

本文主要分析了門面模式及其範例,希望通過本文可以讓大家體會到設計模式並沒有想象中的那麼高深,學習設計模式主要是體會其中的思想,然後在適當的時候可以提升我們運用到我們程式碼中。
請關注我,和孤狼一起學習進步