表妹想學習理財
表妹:哥啊,我想學習理財。
我:可以呀,這樣你的支出才會更有規律。
表妹:但是我不太懂股票,你有入門課程推薦嘛?
我:誰說理財只有股票這一種方式?像債券、貨幣基金甚至房產都是很好的投資標的。
表妹:但是我都不太懂欸,這一個個學下來,估計我都快退休了。
我:其實也不用精通所有,你只要瞭解一些基本的理財知識,剩下的,交給基金經理做就可以啦。
表妹:基金經理?
基金將投資者分散的資金集中起來,基金經理就將這些集中起來的資金,根據自己的專業知識,投資策略,投資於股票、債券、外匯等領域。最後,基金投資的收益再扣除一些託管管理費用後,剩下的就歸投資者所有。
投資標的那麼多,每個投資標的又各式各樣,如果投資者想要做好投資,那麼會花費大量的精力,特別是沒有金融基礎和理財經驗的投資者。我們在不瞭解這些投資標的(子系統)的情況下,需要一個專業的基金經理人(門面)來幫我們理財。
你看,這不就是我們設計模式中的門面模式(又稱外觀模式)嘛?
為子系統中的一組介面提供一個一致的介面。此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
-
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類(基金經理)互動就好了,從而更好地實現了客戶端和子系統的解耦,讓客戶端更容易地使用系統。
可能有同學會問,這基金經理怎麼有點像之前買二手車的代理人呢?
門面模式和代理模式的區別
代理模式
-
代理模式側重於對原物件的訪問控制(當然也可以不是控制而是功能增強)
-
代理與原類實現相同的抽象(相同介面或直接繼承原類)
-
代理只代理一個類
門面模式
-
門面模式側重於功能整合(多個小系統或小物件整合成一個功能豐富的大物件)
-
門面可以與子系統具有不同的抽象(具有不同的介面,可以對方法重新起名)
-
門面代理的是一系列的類(或子系統)
門面模式的優點
-
鬆耦合
使用者與子系統解耦,遮蔽子系統;可以提高子系統的獨立性。
-
使用簡單
簡化使用者與子系統的依賴關係。使用者只與門面對接,有統一的入口,不需要知道所有子系統及內部構造。
門面模式的缺點
-
不規範的程式設計方式
沒有面向抽象程式設計,而是通過增加中介層,轉換服務提供方的服務介面。
門面模式應用場景
-
子系統越來越複雜,增加外觀模式提供簡單呼叫介面;
-
構建多層系統結構,利用外觀物件作為每層的入口,簡化層間呼叫。
-
子系統相對獨立,外界對子系統的訪問只要黑箱操作即可
比如利息的計算問題,沒有深厚的業務知識和紮實的技術水平是不可能開發出該子系統的,但是對於使用該系統的開發人員來說,他需要做的就是輸入金額以及存期,其他的都不用關心,返回的結果就是利息,這時候,門面模式就派上用場了。
總結
為了使用者使用方便,把過度拆分的分散功能,組合成一個整體,對外提供一個統一的介面。
真可謂“開啟一扇門,通向全世界”。
參考