面向物件設計模式之---外觀模式(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();
}
}
執行結果如下: