介紹:
外觀模式屬于結(jié)構(gòu)型模式旺上。它為子系統(tǒng)中的一組接口提供一個一致的界面瓶蚂,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用宣吱。
類圖:
Facade(外觀角色):為子系統(tǒng)統(tǒng)一接口窃这。
System(子系統(tǒng)角色):具有各種復(fù)雜行為。
用法:
? 用外觀模式解耦降低了用戶的使用成本征候。(例如在設(shè)計代碼初段杭攻,應(yīng)該有意識地將不同的層分離。如經(jīng)典的MVC模式中疤坝,View層和Model層界面與數(shù)據(jù)的分離兆解,Controller擔(dān)任外觀角色)
? 為一個復(fù)雜子系統(tǒng)提供一個簡單接口。(子系統(tǒng)往往會不斷變化而變得越來越難維護跑揉,這種易變性使得隱藏子系統(tǒng)的具體變化極為重要)
? 維護一個大型遺留的系統(tǒng)時锅睛。(讓外觀角色為遺留代碼設(shè)計一個簡單的接口,讓新系統(tǒng)和外觀角色交互)
個人理解:
這個模式非常簡單历谍,為一個或多個系統(tǒng)提供一個簡單的接口现拒。需要跟復(fù)雜系統(tǒng)交互的時候可以考慮使用這個模式。
例子:
專注開發(fā)工作的你一定使用過此模式望侈,就在我們接入第三方SDK的時候印蔬,都會有意識地用一個“幫助類”去跟SDK具體方法交互,只關(guān)心自己需要用的數(shù)據(jù)脱衙。下面用一個TalkingData第三方SDK的幫助類過一下:
需求:模擬SDK的使用
1侥猬、TalkingDataSDK的使用
首先簡單介紹TalkingData例驹,是專門做數(shù)據(jù)統(tǒng)計的公司,可以根據(jù)自己需求組合各種子SDK退唠,例如頁面埋點眠饮、點擊事件分析、支付的漏洞模型等等铜邮。在這里非常適合使用外觀模式去封裝仪召。
1.1、核心部分
/**
* 初始化TalkingData SDK
*
* @param context
*/
public void initTDSDK(Context context) {
try {
TalkingDataAppCpa.init(context, "123123123123123123", MainApplication.FLAVOR);
TCAgent.init(context, "456456456456456", MainApplication.FLAVOR);
} catch (Exception e) {
e.printStackTrace();
}
}
初始化SDK時松蒜,我們同時初始化兩個子系統(tǒng)TalkingDataAppCpa和TCAgent扔茅。
對于程序員來說,封裝一齊的目的是他們是同一家公司的兩個子系統(tǒng)秸苗,我未來還可能接入更多的該公司的功能召娜,就一并放在這個類方便管理。
1.2惊楼、各種子系統(tǒng)的方法舉例
/**
* 關(guān)閉TalkingData SDK日志輸出
*/
public void disableDebug() {
TalkingDataAppCpa.setVerboseLogDisable();
}
/**
* 注冊成功事件
*
* @param mid 用戶member_id
*/
public void onRegister(String mid) {
TalkingDataAppCpa.onRegister(mid);
}
/**
* 登錄成功事件
*
* @param mid 用戶member_id
*/
public void onLogin(String mid) {
TalkingDataAppCpa.onLogin(mid);
}
/**
* 下單事件
*
* @param mid 用戶member_id
*/
public void onOrder(String mid, String orderId, String totalPrice) {
Order order = Order.createOrder(orderId, (int) (Float.parseFloat(totalPrice) * 100), "CNY");
TalkingDataAppCpa.onPlaceOrder(mid, order);
}
/**
* 支付成功事件
*
* @param mid 用戶member_id
*/
public void onPaySucceed(String mid, String orderId, String amount, String paytype) {
TalkingDataAppCpa.onOrderPaySucc(mid, orderId, (int) (Float.parseFloat(amount) * 100), "CNY", paytype);
}
/**
* 事件管理-點擊事件
*
* @param context Activity上下文
* @param eventId 事件ID
* @param eventLabel 事件標簽
* @param eventDetail 事件細節(jié)
*/
public void onEvent(Context context, String eventId, String eventLabel, Map eventDetail) {
TCAgent.onEvent(context, eventId, eventLabel, eventDetail);
}
/**
* 進入頁面
* @param context
* @param pageName 頁面名稱玖瘸。
* onPageStart 和 onPageEnd 必須成對調(diào)用;
*/
public void onPageStart(Context context,String pageName){
TCAgent.onPageStart(context,pageName);
}
/**
* 退出頁面
* @param context
* @param pageName
*/
public void onPageEnd(Context context,String pageName {
TCAgent.onPageEnd(context,pageName);
}
使用者不需要知道具體的實現(xiàn)檀咙,完全隱藏了實現(xiàn)細節(jié)雅倒。另一方面,隨著SDK不停地迭代更新弧可,實現(xiàn)方法有可能變得面目全非蔑匣。因此后續(xù)維護工作只在這個類完成就可以了,否則改動一個方法需要在你所有的實現(xiàn)的地方都改一遍可多崩潰棕诵。
2裁良、總結(jié)
此模式比較常用,相信你已經(jīng)在不知不覺中使用了校套!主要用法還是作為一些第三方SDK的幫助類价脾。
感謝您的閱讀~
轉(zhuǎn)載請注明出處喔:http://www.reibang.com/p/45dcde8a0715
推薦閱讀
基礎(chǔ)篇:
設(shè)計模式前篇之——UML類圖必會知識點
設(shè)計模式前篇之——一起過一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡易理解設(shè)計模式之:簡單工廠模式——來試試接入支付功能
簡易理解設(shè)計模式之:工廠方法模式——數(shù)據(jù)存儲例子
簡易理解設(shè)計模式之:抽象工廠模式——更換數(shù)據(jù)庫例子
簡易理解設(shè)計模式之:建造者模式——學(xué)習(xí)使用“鏈式調(diào)用”
簡易理解設(shè)計模式之:原型模式——深笛匙、淺拷貝的概念
簡易理解設(shè)計模式之:單例模式——單例模式的幾種常用寫法
結(jié)構(gòu)型模式:
簡易理解設(shè)計模式之:適配器模式——Android列表視圖控件設(shè)計方式
簡易理解設(shè)計模式之:橋接模式——穿衣服經(jīng)典案例2
簡易理解設(shè)計模式之:組合模式——實現(xiàn)View中的樹狀結(jié)構(gòu)
簡易理解設(shè)計模式之:裝飾模式——穿衣服經(jīng)典案例
簡易理解設(shè)計模式之:外觀模式——第三方SDK的幫助類
簡易理解設(shè)計模式之:享元模式——五子棋游戲例子
簡易理解設(shè)計模式之:代理模式——iOS視圖控件設(shè)計方式
行為型模式:
簡易理解設(shè)計模式之:策略模式——優(yōu)化一下支付功能
簡易理解設(shè)計模式之:模板方法模式——Android中的BaseActivity基類
簡易理解設(shè)計模式之:觀察者模式——監(jiān)聽與回調(diào)
簡易理解設(shè)計模式之:狀態(tài)模式——優(yōu)化登錄操作
簡易理解設(shè)計模式之:備忘錄模式——Word文檔的工作原理
簡易理解設(shè)計模式之:迭代器模式——遍歷對象的好幫手
簡易理解設(shè)計模式之:命令模式——實現(xiàn)命令的參數(shù)化配置
簡易理解設(shè)計模式之:責(zé)任鏈模式——OA中請假流程示例
簡易理解設(shè)計模式之:中介者模式——多人聊天室例子
簡易理解設(shè)計模式之:解釋器模式——語言和文法
簡易理解設(shè)計模式之:訪問者模式——員工考核例子