在新公司中擔任架構(gòu)師的職位后想對原有的app系統(tǒng)進行架構(gòu)的重構(gòu)。
先簡單吐槽說一下原來App的架構(gòu)寻定,據(jù)說App的系統(tǒng)架構(gòu)用的是MVC架構(gòu)(我呵呵)暴匠,懂的人都知道此時的我心里有幾萬頭草泥馬在奔騰了。
雖然我第一件做的事情是對系統(tǒng)進行分層和模塊劃分房维,但最近因為網(wǎng)絡模塊無法滿足業(yè)務需求沼瘫,我就同時對網(wǎng)絡進行了設計。
新的網(wǎng)絡模塊的設計采用了3層的設計模式咙俩,從下到上分別是Api層耿戚、Service層、interface層阿趁,架構(gòu)圖如下(自己手繪的溅话,還請見諒)。
image.png
下面分別介紹各層的作用歌焦,及代碼描述語言
Api層
如圖中所示飞几,Api層承擔的責任有
1、封裝第三方網(wǎng)絡庫
2独撇、實現(xiàn)post屑墨、get、upload等方法
3纷铣、實現(xiàn)cancel方法
class HTTPApi {
HTTPApi getInstance() {
//如果需要保管第三方的網(wǎng)絡對象卵史,這里可以實現(xiàn)一個單例
}
get(url, args, header, userAgent) {
//調(diào)用第三方get方法
return respData;
}
post(url, args, header, userAgent) {
//調(diào)用第三方post方法
return respData;
}
}
Service層
如圖中所示,Service層承擔的責任有
1搜立、設置公共參數(shù)
2以躯、設置header、ua
3啄踊、初步解析數(shù)據(jù)并處理公共Error
class HTTPService {
header() {
return {
"authentication": "133mfdmfldd",
"Content-Type": "application/json",
"X-timestamp": currentTimeMillis(),
...
}
}
userAgent() {
return "自定義的userAgent忧设,一般是在系統(tǒng)ua后面加自己的內(nèi)容";
}
static get(url, args, success, failure) {
//args+公共參數(shù)
resp = HTTPApi.instance.get(url, args, header(), userAgent());
if (resp.code == "A000") {
success(resp.data);
} else if (resp.code == "A220") {
//處理此公共錯誤
} else if(resp.code == "B150") {
//處理此公共錯誤
} else {
//返回業(yè)務錯誤
failure(AppError(resp.code, resp.message));
}
}
static post(url, args) {
//args+公共參數(shù)
resp = HTTPApi.instance.post(url, args, header(), userAgent());
if (resp.code == "A000") {
success(resp.data);
} else if (resp.code == "A220") {
//處理此公共錯誤
} else if(resp.code == "B150") {
//處理此公共錯誤
} else {
//返回業(yè)務錯誤
failure(AppError(resp.code, resp.message));
}
}
}
Interface層
Interface層的責任比較簡單,他主要是·對每個業(yè)務接口進行封裝
class HTTPUserInterface {
static getUrl(path) {
if (kDebug) {
return "http://debug-user.abc.com/" + path;
} else {
return "http://user.abc.com/" + path;
}
}
static login(userName, password, success, failure) {
Map args = {"userName": userName, "password": password};
HTTPService.post(getUrl("account/login"), args, success, failure):
}
static getUserInfo(success, failure) {
HTTPService.get(getUrl("account/userInfo"), null, success, failure);
}
}
class HTTPMarketInterface {
//基本同HTTPUserInterface
}
...
UI層
UI層即為用戶能見到的界面颠通,此層不屬于網(wǎng)絡層址晕,但會調(diào)用Service層來獲取數(shù)據(jù)
class LoginPage {
//點擊登錄按鈕后
loginButtonClicked() {
HTTPUserInterface.login("aprogram", "123456", (data) {
_response = LoginModel.fromJson(data);
//刷新頁面,跳轉(zhuǎn)頁面
}, (error) {
Toast(error.message);
});
}
}
歡迎大家交流溝通