今天在进行服务器迁移的时候需要将之前的代码用两种方式实现。
具体的业务场景为:
之前的调用方调用一个http接口获取服务,但是现在这个http接口需要废掉了。
而这个http服务分布在不同的主机上,
所以调用方的写法是类似于下面这样:
public Map<Long, Integer> getServiceUsersState(List<Long> serviceUserIds, String host);
其中host为传入的服务所在的域名,当然,前面还有一个网关负责服务的分发。
所以我要做的就是将所有带host的接口找出来,写出一个不带host的版本。
然后将所有调用带host的接口的方法,按照逻辑分为两种调用,
即如果是调到废掉的服务器上的方法走不带host的,如果不是则继续走原先的方法。
所以我写了一个没有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:一般是更新不了了。。。。
补一张随缘图(有缘者能看懂):