今天在進行服務器遷移的時候須要將以前的代碼用兩種方式實現。服務器
具體的業務場景爲:spa
以前的調用方調用一個http接口獲取服務,可是如今這個http接口須要廢掉了。orm
而這個http服務分佈在不一樣的主機上,blog
因此調用方的寫法是相似於下面這樣:接口
public Map<Long, Integer> getServiceUsersState(List<Long> serviceUserIds, String host);get
其中host爲傳入的服務所在的域名,固然,前面還有一個網關負責服務的分發。博客
因此我要作的就是將全部帶host的接口找出來,寫出一個不帶host的版本。域名
而後將全部調用帶host的接口的方法,按照邏輯分爲兩種調用,it
即若是是調到廢掉的服務器上的方法走不帶host的,若是不是則繼續走原先的方法。form
因此我寫了一個沒有host的版本。不調用原先的http接口。
public Map<Long, Integer> getServiceUsersStateNoHost(List<Long> serviceUserIds);
那麼問題來了,有以下相似代碼:
public Result switchService(long userId, long shopId, long curServiceUserId, long nextServiceUserId, String host, PlatformEnum type) {
//大量代碼
splitServiceUserIds = getSplitServiceUserIds(shopId, host);
//大量代碼
}
private Map<String, List<Long>> getSplitServiceUserIds(long shopId, String host){
//大量代碼
serviceStateMap = sellerServiceBiz.getServiceUsersState(totalServiceUserIds,host);
//大量代碼
}
這裏switchService裏面有個PlatformEnum能夠判斷須要調用有host的仍是沒有host的方法。
方法1:
switchService中加一個
if (PlatformEnum.type1!= type) {
splitServiceUserIds = getSplitServiceUserIds(shopId, host);
} else {
splitServiceUserIds = getSplitServiceUserIdsNoHost(shopId);
}
這樣的判斷,而後在寫一個getSplitServiceUserIdsNoHost方法,方法裏面調用的是getServiceUsersStateNoHost。
這樣也能夠完成目標可是就有了大量的代碼的重複。
而我想的是是否能夠重寫getSplitServiceUserIds這個方法,讓他能夠判斷出若是是不須要host版本的就調用getServiceUsersStateNoHost
反之,則調用getServiceUsersState。這樣就須要注入一個type屬性,須要改寫switchService裏面的getSplitServiceUserIds。不符合開閉原則。
因此我就在getSplitServiceUserIds裏面本身又包了一層。加了個type字段,同時寫了個getSplitServiceUserIdsNoHost也加了個字段。利用這個字段區分,則不具有侵入性了。
僞代碼以下:
private Map<String, List<Long>> getSplitServiceUserIdsNoHost(long shopId) {
//switchService裏面判斷是沒有host版本調用這個,而後他出入type=true
boolean type = true;
String host=null;
return getSplitServiceUserIds(type,shopId,host);
}
private Map<String, List<Long>> getSplitServiceUserIds(long shopId, String host){
//switchService裏面判斷是有host版本調用這個,而後他出入type=false
boolean type = false;
return getSplitServiceUserIds(type,shopId,host);
}
private Map<String, List<Long>> getSplitServiceUserIds(boolean type,long shopId, String host){
//根據傳入的type調用相應的host或者nohost
if(type == true) {
serviceStateMap = sellerServiceBiz.getServiceUsersStateNoHost(totalServiceUserIds);
}else {
serviceStateMap = sellerServiceBiz.getServiceUsersState(totalServiceUserIds,host);
}
}
這樣的作法減小了代碼的侵入性,同時完成了業務邏輯的判斷,只改了本身須要的部分,不影響別人的調用。
話說的很亂。0-0 等我組織好語言在來更新這篇博客。PS:通常是更新不了了。。。。
補一張隨緣圖(有緣者能看懂):