設計模式之【門面模式(外觀模式)】

Gopher大威發表於2022-03-24

表妹想學習理財

表妹:哥啊,我想學習理財。

:可以呀,這樣你的支出才會更有規律。

表妹:但是我不太懂股票,你有入門課程推薦嘛?

:誰說理財只有股票這一種方式?像債券、貨幣基金甚至房產都是很好的投資標的。

表妹:但是我都不太懂欸,這一個個學下來,估計我都快退休了。

:其實也不用精通所有,你只要瞭解一些基本的理財知識,剩下的,交給基金經理做就可以啦。

表妹:基金經理?

基金將投資者分散的資金集中起來,基金經理就將這些集中起來的資金,根據自己的專業知識,投資策略,投資於股票、債券、外匯等領域。最後,基金投資的收益再扣除一些託管管理費用後,剩下的就歸投資者所有。

投資標的那麼多,每個投資標的又各式各樣,如果投資者想要做好投資,那麼會花費大量的精力,特別是沒有金融基礎和理財經驗的投資者。我們在不瞭解這些投資標的(子系統)的情況下,需要一個專業的基金經理人(門面)來幫我們理財。

你看,這不就是我們設計模式中的門面模式(又稱外觀模式)嘛?

 

為子系統中的一組介面提供一個一致的介面。此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

 

  • Facade角色:為多個子系統對外提供一個共同的介面。

  • SubSystem角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。

  • Client角色:通過一個外觀角色訪問各個子系統的功能。

SubSystem角色中的類:有股票、債券、貨幣基金等這麼多投資標的。

 1 public class Stock {
 2     public void StockTrading() {
 3         System.out.println("買賣股票");
 4     }
 5 }
 6  7 public class Bond {
 8     public void BondTrading() {
 9         System.out.println("買賣債券");
10     }
11 }
12 13 public class MonetaryFund {
14     public void MonetaryFundTrading() {
15         System.out.println("買賣貨幣基金");
16     }
17 }

Facade角色類:專業的基金經理負責幫我們投資。

 1 public class FundManager {
 2     private Stock stock = new Stock();
 3     private Bond bond = new Bond();
 4     private MonetaryFund monetaryFund = new MonetaryFund();
 5     
 6     // 買賣股票型基金
 7     public void StockFund() {
 8         stock.StockTrading();
 9     }
10     
11     // 買賣債券型基金
12     public void BondFund() {
13         bond.BondTrading();
14     }
15     
16     // 買賣貨幣基金
17     public void MonetaryFund() {
18         monetaryFund.MonetaryFundTrading();
19     }
20     
21     // 買賣混合基金
22     public void HybridFund() {
23         stock.StockTrading();
24         bond.BondTrading();
25         monetaryFund.MonetaryFundTrading();
26     }
27 }

Client角色類

 1 public class Client {
 2     public static void main(String[] args) {
 3         // 表妹自己選擇投資標的
 4         // 瞭解股市
 5         Stock stock = new Stock();
 6         stock.StockTrading();
 7         // 瞭解債市
 8         Bond bond = new Bond();
 9         bond.BondTrading();
10         // 瞭解貨幣基金
11         MonetaryFund.monetaryFund = new MonetaryFund();
12         monetaryFund.MonetaryFundTrading();
13         
14         // 實在太麻煩了...
15         
16         // 找到一個基金經理
17         FundManager fundManager = new FundManager();
18         
19         // 如果追求高收益,買股票型基金
20         fundManager.StockFund();
21         
22         // 如果追求低風險,穩健,買混合型基金
23         fundManager.HybridFund();
24     } 
25 }

你看,如果沒有專業的基金經理的話,表妹理財要了解股市、債市、貨幣基金等投資標的(子系統),這對客戶端(表妹)來說,無疑是一種壓力。

但是現在有了專業的基金經理後,客戶端(表妹)只需要跟Facade類(基金經理)互動就好了,從而更好地實現了客戶端和子系統的解耦,讓客戶端更容易地使用系統。

可能有同學會問,這基金經理怎麼有點像之前買二手車的代理人呢?

門面模式和代理模式的區別

代理模式

  • 代理模式側重於對原物件的訪問控制(當然也可以不是控制而是功能增強)

  • 代理與原類實現相同的抽象(相同介面或直接繼承原類)

  • 代理只代理一個類

門面模式

  • 門面模式側重於功能整合(多個小系統或小物件整合成一個功能豐富的大物件)

  • 門面可以與子系統具有不同的抽象(具有不同的介面,可以對方法重新起名)

  • 門面代理的是一系列的類(或子系統)

門面模式的優點

  • 鬆耦合

    使用者與子系統解耦,遮蔽子系統;可以提高子系統的獨立性。

  • 使用簡單

    簡化使用者與子系統的依賴關係。使用者只與門面對接,有統一的入口,不需要知道所有子系統及內部構造。

門面模式的缺點

  • 不規範的程式設計方式

    沒有面向抽象程式設計,而是通過增加中介層,轉換服務提供方的服務介面。

門面模式應用場景

  • 子系統越來越複雜,增加外觀模式提供簡單呼叫介面;

  • 構建多層系統結構,利用外觀物件作為每層的入口,簡化層間呼叫。

  • 子系統相對獨立,外界對子系統的訪問只要黑箱操作即可

    比如利息的計算問題,沒有深厚的業務知識和紮實的技術水平是不可能開發出該子系統的,但是對於使用該系統的開發人員來說,他需要做的就是輸入金額以及存期,其他的都不用關心,返回的結果就是利息,這時候,門面模式就派上用場了。

總結

為了使用者使用方便,把過度拆分的分散功能,組合成一個整體,對外提供一個統一的介面。

真可謂“開啟一扇門,通向全世界”。

參考

23種設計模式-門面模式(外觀模式)老楊叔叔csdn的部落格-CSDN部落格門面模式

相關文章