前言
- 外觀模式是封裝API的常用手段.通過一個外觀類使得整個系統的接口只有一個統一的高層接口,這樣能夠降低用戶的使用成本,也對用戶屏蔽了很多實現細節.
定義
- 定義:要求一個子系統的外部與內部的通信必須通過一個統一的對象進行.門面模式(Facade模式)提供一個高層次的接口,使得子系統更容易使用
- 使用場景:
1.爲一個複雜的子系統提供一個簡單統一的接口,對外隱藏子系統的具體實現,隔離變化.
2.當你需要構建一個層次接口的子系統時,使用Facade模式定義子系統中每層的入口點. - 優點:
1.對客戶程序隱藏子系統細節,因而減少了客戶對於子系統的耦合,能夠擁抱變化
2.外觀類對子系統的接口封裝,使得系統更易於使用. - 缺點:
1.外觀類接口膨脹,在一定程度上增加了用戶的使用成本
2.外觀類沒有遵循開閉原則,當業務出現變更時,可能需要直接修改外觀類.
UML類圖
- Facade:系統對外的統一接口,系統內部系統得工作.
- SystemA,SystemB,SystemC:子系統接口.
一個統一的接口對外提供服務,使得外部程序只通過一個類就可以實現系統內部的多種功能.
實現案例
- 這裏通過一個模擬手機撥號等業務的案例來表現外觀模式.
1.首先將子類的具體實現寫在內部,主要由接口和實現內組成.
/**
* 打電話接口
* Created by max on 2016/4/12.
*/
public interface Phone {
//撥電話
public void dail();
//掛斷
public void hangup();
}
/**
* 撥打電話具體的實現類
* Created by max on 2016/4/12.
*/
public class PhoneImpl implements Phone{
@Override
public void dail() {
//寫具體業務
}
@Override
public void hangup() {
//寫具體業務
}
}
2.將子類具體的實現,封裝在一個統一的對外高層次接口裏面,其實也就是用戶能調用的類,用戶只用調取這個類的方法,就可以實現相關功能了.
/**
* 手機的相關功能
* 使用對不同子類引用的相關方法,實現具體的不同業務功能
* Created by max on 2016/4/12.
*/
public class MobilePhone {
private Phone mPhone = new PhoneImpl();
private Cemera mCemera = new SamsungCamera();
public void dail(){
mPhone.dail();
}
public void videoChat(){
mCemera.open();
mPhone.dail();
}
}
總結
- 以上案例是否理解外觀模式很簡單呢,不過具體應用到實際開發中,還需要我們在真實場景下演練.
- 以下是demo的源碼,點擊下載.http://download.csdn.net/detail/qq_28690547/9488802