1. 程式人生 > >面向物件設計模式之---外觀模式(Facade Pattern)

面向物件設計模式之---外觀模式(Facade Pattern)

今天要向大家介紹的設計模式是外觀模式。外觀模式,聽上去好像很高大上的樣子,其實是非常簡單的。

《大話設計模式》 這本書中舉的是股票與基金的例子。我又不炒股,對這些也不太敏感,於是就換一個更加通俗易懂的例子來解釋一下這個模式吧~

比如我們買了一張新的手機卡後都需要辦理一些業務。但是,在運營商提供的眾多業務中尋找最適合自己的難免有些困難。這時,我們就會去請教營業廳的客戶服務經理,把自己的需求告訴他/她,讓他們幫助我們進行選擇組合。

把上面這個例子對應到軟體開發中,如果我們不去找客戶服務經理,而是單幹的話,由於要面對許多業務,而且我們並不能很清楚的瞭解每一項業務具體是做什麼的,這樣就加大了選擇難度,對映到軟體領域,耦合性就大大增加

。如果尋求專業人士幫助,這個耦合性就會減少。

以上說的這些就是外觀模式

外觀模式,為子系統中的一組介面提供一個一致的介面。此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 ——《大話設計模式》

這個模式很好的體現了面向物件設計思想中依賴倒轉原則迪米特法則

知識點補充:
1. 依賴倒轉原則:可以簡單理解為程式設計的時候要面向介面程式設計,而不是面向實現程式設計。
2. 迪米特法則:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中一個類需要呼叫另一個類的某一個方法的話,可以通過第三者轉發這個呼叫。

上面提及的辦理手機業務的例子,利用外觀模式的UML類圖如下:

這個Facade類的作用就是對ServiceA、ServiceB、ServiceC三款服務進行操作包裝,Facade類作為一個橋樑的作用連線外界和內部的子系統。對於使用者而言,無需知道這三款服務的存在。所以不難看出,這個Facade類可以做為一個高階的介面對外,開發者可以根據它提供的方法進行程式設計;同時,這個Facade類又掌管著若干個不相干的類,通過Facade進行組織呼叫,這正體現了上面說的兩大原則。

實現程式碼如下:

import java.util.*;

//業務A  這裡可以理解為某項具體業務,下同
class ServiceA
{
  public void subscribe
() { System.out.println("購買了業務A"); } public void unsubscribe() { System.out.println("退訂了業務A"); } } //業務B class ServiceB { public void subscribe() { System.out.println("購買了業務B"); } public void unsubscribe() { System.out.println("退訂了業務B"); } } //業務C class ServiceC { public void subscribe() { System.out.println("購買了業務C"); } public void unsubscribe() { System.out.println("退訂了業務C"); } } //外觀類 這裡可以理解為客戶服務經理 class Facade { private ServiceA sa; private ServiceB sb; private ServiceC sc; public Facade() { sa = new ServiceA(); sb = new ServiceB(); sc = new ServiceC(); } public void buyPackageA() { sa.subscribe(); sc.subscribe(); } public void buyPackageB() { sb.subscribe(); sa.subscribe(); } public void unsubscribeA() { sa.unsubscribe(); sc.unsubscribe(); } public void unsubscribeB() { sb.unsubscribe(); sa.unsubscribe(); } } public class Main { public static void main(String[] args) { Facade face = new Facade(); face.buyPackageB(); face.unsubscribeB(); } }

執行結果如下: