天天看點

設計模式之外觀模式(Facade)

設計模式之外觀模式(Facade)

1.初識外觀模式

  這次不先說例子了,先看看一看外觀模式的定義吧:

外觀模式:提供了一個統一的接口,用來通路子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。

  在軟體開發系統中,客戶程式經常會與複雜系統的内部子系統之間産生耦合,而導緻客戶程式随着子系統的變化而變化。那麼如何簡化客戶程式與子系統之間的互動接口?如何将複雜系統的内部子系統與客戶程式之間的依賴解耦?這就是外觀模式的作用了,我們通過一個外觀類定義一個高層接口,該接口中包含子系統的中的接口,這樣用戶端隻需要通過外觀類通路各種子系統就可以啦。結構圖表示如下:

設計模式之外觀模式(Facade)

  看看這個例子:生活中,人們多多少少都玩過股票吧,那麼大家知道股票和基金有什麼差別嗎?股票的風險大,盈利高,但是一般的股民沒有專業的知識則盈利的可能性較低。于是有了一批人,開始購買基金,因為基金風險低,盈利又比銀行利率可觀。那麼大家知道這是為什麼嗎?基金背後是怎麼運作的呢?實際上是:我們客戶買基金,錢給他們,他們拿着這個錢去買股票,買債券等等來進行錢生錢的活動,相比之下他們有專業的團隊,盈利的可能性更大,是以基金就有了存在的意義。對比一下外觀模式的定義,是不是發現這和外觀模式是極其的吻合呢?基金就是這個外觀啊!!看看我們如何完成應用外觀模式的代碼吧。(例子參考了《大話設計模式》)

2.外觀模式實作

 外觀模式的代碼如下: 

設計模式之外觀模式(Facade)
1 //股票1類
 2 class Stock1
 3 {
 4 public:
 5     void Sell();
 6     void Buy();
 7 };
 8 //股票2類
 9 class Stock2
10 {
11 public:
12     void Sell();
13     void Buy();
14 };
15 //國債1
16 class NationalDebt1
17 {
18 public:    
19     void Sell();
20     void Buy();
21 };
22 //外觀類
23 class FundFacade
24 {
25     Stock1 *stock1;
26     Stock2 *stock2;
27     NationalDebt1 *national_debt1;
28 public:
29     FundFacade()
30     {
31         stock1 = new Stock1();
32         stock2 = new Stock2();
33         national_debt1 = new NationalDebt1();
34     }
35     void BuyMethod1()
36     {
37         stock1->Buy();
38         national_debt1->Buy();
39     }
40     void BuyMethod2()
41     {
42         stock2->Buy();
43         national_debt1->Buy();
44     }
45 };      
設計模式之外觀模式(Facade)

通過外觀模式用戶端隻需要通路FundFacade類中的成員就可以了,并不需要與具體的每個Stock1,Stock2和 NationalDebt1 相關聯。這大大降低了耦合性,同時也使得系統容易維護,易于擴充。若需要擴充股票類,隻需要加入Stock類;若有了新的購買方案,隻需要在FundFacade 類中加一個BuyMethod方法。

3.使用外觀模式的場合和好處

(1)在設計初期階段,應該有意識的将不同的兩個層分離,比如經典的三層架構,就需要考慮在資料通路層、業務邏輯層和表示層的層與層之間建立外觀,這樣可以為複雜的子系統提供一個簡單的接口,使得耦合性大大的降低。

(2)在開發階段,子系統往往因為不斷的重構演化而變得原來越複雜,大多數的模式使用時也都會産生很多很小的類,這本是好事,但也給外部調用它們的使用者程式帶來了使用上的困難,增加外觀可以提供一個簡單的接口,減少它們之間的依賴。

(3)在維護一個遺留的一個大型系統時,可能這個系統已經非常難以維護和擴充了,但是因為它包含非常重要的功能,新的系統開發必須依賴它,這時也可以應用外觀模式。可以為新系統開發一個外觀類,來提供粗糙和高度複雜的遺留代碼的比較清晰、簡單的接口,讓新系統與外觀類對象互動,外觀類負責與遺留代碼互動所有複雜的工作。這樣分兩個小組,一個小組開發外觀類與老系統的互動,另一個小組隻要了解外觀類的接口,直接開發新系統調用這些接口就可以了。

繼續閱讀