統一的編程接口之外觀模式

外觀模式介紹

外觀模式(Facade)在開發過程中的運用頻率非常高,尤其是在現階段各種第三方SDK充斥在我們的周邊,而這些SDK很大概率會使用外觀模式。通過一個外觀類使得整個系統的接口只有一個統一的高層接口,這樣能夠降低用戶的使用成本,也對用戶屏蔽了很多實現細節。當然在我們的開發過程中,外觀模式也是我們封裝API的常用手段,例如網絡模塊,ImageLoader模塊等。
可能你已經在開發中運用無數次外觀模式,只是沒有在理論層面上去認識它,本章我們就從理論結合實踐的角度學習這個模式。

外觀模式的定義

要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。門面模式(Facade模式)提供一個高層次的接口,使得子系統更易於使用。

外觀模式的使用場景

(1)爲一個複雜子系統提供一個簡單接口。子系統往往因爲不斷演化而變得越來越複雜,甚至可能被替換。大多數模式使用時都會產生更多更小的類,而使用外觀模式使得子系統更具可重用性的同時也更簡單對子系統進行定製,修改,這種易變性使得隱藏子系統的具體實現變得尤爲重要。Facade可以提供一個簡單統一的接口,對外隱藏子系統的具體實現,隔離變化

(2)當你需要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過Facade接口進行通信,從而簡化它們之間的依賴關係。

外觀模式的簡單示例

生活中使用外觀模式的例子非常多,任何一個類似中央調度結構的組織都類似外觀模式。舉個簡單的例子,手機就是一個外觀模式的例子,它集合了電話功能,短信功能,GPS,拍照等於一身,通過手機你就可以完成各種功能。而不是當你打電話時使用一個諾基亞,要拍照時非得用一個相機,如果是這樣每使用一個功能你就必須操作特定的設備,會使得整個過程很繁瑣。而手機給你一個統一的接口,集電話,上網,拍照功能於一身,使用方便,操作簡單。下面我們來簡單模擬一下手機的外觀模式的實現,首先我們建立一個MobilePhone類。代碼大致如下所示

public class MobilePhone{
private Phone mPhone=new PhoneImpl();
private Camera mCamera=new HuaweiCamera();

public void dial(){
mPhone.dail();
}

public void videoChat(){
System.out.println("-->視頻聊天接通中");
mCamera.open();
mPhone.dail();
}

public void hangup(){
mPhone.hangup():
}

public void takePicture(){
mCamera.open();
mCamera.takePicture();
}

public void clothCamera(){
mCamera.cloth();
}
}

MobilePhone類中含有兩個子系統,也就是說撥號系統和拍照系統,MobilePhone就這兩個系統封裝起來,爲用戶提供一個統一的接口,也就是說用戶只需要通過MobilePhone這個類就可以操作打電話和拍照這兩個功能。用戶不需要知道Phone這個接口以及它的實現類PhoneImpl,同樣也不需要知道Camera相關的信息,通過MobilePhone就可以包攬一切。而在MobilePhone中也封裝了兩個子系統的交互,例如視頻通話需要先打開攝像頭,然後再開始撥號,如果沒有這一步的封裝,每次用戶實現視頻通話功能時都需要手動打開攝像頭,進行撥號,這樣會增加用戶的使用成本,外觀模式使得這些操作更加簡單,易用。

我們來看看Phone接口PhoneImpl

public interface Phone{
//打電話
public void dail();
//掛斷電話
public void hangup();
}

class PhoneImpl implements Phone{
@Override
public void dail(){
System.out.println("打電話");
}

@Override
public void hangup(){
System.out.println("掛斷"); 
}
}

代碼很簡單就是單純的抽象與實現。Camera也是類似的實現,具體代碼如下所示

public interface Camera{
public void open();
public void takePicture();
public void close();
}

class HuaweiCamera implements Canera{
@Override
public void open(){
System.out.println("打開相機");
}

@Override
public void takePicture(){
System.out.println("拍照");
}

@Override
public void close(){
System.out.println("關閉相機");
}
} 

測試代碼如下

public class Test{
public static void main(String[] args){
MobilePhone honor9 =new MobilePhone();
//拍照
honor9.takePicture();
//視頻聊天
honor9.videoChat();
}
}

運行結果

打開相機
拍照
打開相機
帶電話

分析

從上述代碼可以看到,外觀模式就是統一接口封裝。將子系統的邏輯,交互隱藏起來,爲用戶提供一個高層次的接口,使得系統更加易用,同時對外隱藏具體的實現,這樣即使具體的子系統發生變化,用戶也不會感知,因爲用戶使用的是Facade高層接口,內部的變化對於用戶來說並不可見。這樣一來就將變化隔離開,使得系統也更加靈活。

發佈了100 篇原創文章 · 獲贊 93 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章