前言
在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法
一、枚举法替代
我先前写了一篇文章,可以去看看。
通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博客
二、定义接口,实现类
通过定义初始方法,通过添加多个实现类来选择
-
接口
public interface ISoapServer {
/**
* 服务编码
* @return
*/
String getCode();
/**
* 服务
* @param xml
* @return
*/
String server(String xml);
}
-
实现类
其中一个实现类,其他的类似
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import us.codecraft.webmagic.selector.Html;
import java.util.List;
/**
* @author HuangZheng
* @create 2023-05-05 9:49
* @description 居民信息提交服务
*/
@Service
public class Soap06IstPr1 implements ISoapServer {
@Autowired
private WebClientServer webClientServer;
@Override
public String getCode() {
return "IST-PR1";
}
@Override
public String server(String xml) {
try {
if (StrUtil.isBlank(xml)) {
throw new BaseException("参数不能为空!");
}
// 要插入的业务表
Patient patient = new Patient();
String pid = IdUtil.fastSimpleUUID();
patient.setPid(pid);
// 第一步 解析参数
Html requestXml = Html.create(xml);
// 获取身份证号
// 1、从开头寻找
List<String> idNoList = requestXml.xpath("//personInfo/identifier/value/@value").all();
// 2、从assignedPerson节点寻找
List<String> tempIdNoList = requestXml.xpath("//assignedPerson/identifier/value/@value").all();
idNoList.addAll(tempIdNoList);
for (String s : idNoList) {
if (IdcardUtil.isValidCard(s)) {
patient.setIdNo(s);
patient.setIdTypeCode("01");
patient.setIdTypeName("身份证");
// 只要能取到一个就行
break;
}
}
// 姓名
final String name = requestXml.xpath("//personInfo/assignedPerson/name/@value").get();
patient.setName(name);
// 性别
final String sexCode = requestXml.xpath("//personInfo/assignedPerson/gender/@value").get();
patient.setSexCode(sexCode);
ExceptionUtil.soapExcpition("1",name);
ExceptionUtil.soapExcpition("2",sexCode);
final String sexName = XmlReadUtil.getRangeByKey("GB/T 2261.1-2003", sexCode).getValue();
patient.setSexName(sexName);
// 手机号码
String telNo = requestXml.xpath("//personInfo/telecom/value/@value").get();
patient.setTelNo(telNo);
// 获取地址address
String presentAddress = requestXml.xpath("//personInfo/address/text/@value").get();
String presentAddrProvi = requestXml.xpath("//personInfo/address/state/@value").get();
String presentAddrCity = requestXml.xpath("//personInfo/address/city/@value").get();
String presentAddrCounty = requestXml.xpath("//personInfo/address/district/@value").get();
String presentAddrTown = requestXml.xpath("//personInfo/address/town/@value").get();
String presentAddrVillage = requestXml.xpath("//personInfo/address/street/@value").get();
String presentAddrHouNo = requestXml.xpath("//personInfo/address/houseNumber/@value").get();
// 存值
patient.setPresentAddress(TextUtil.getStr(presentAddress, "-"));
patient.setPresentAddrProvi(TextUtil.getStr(presentAddrProvi, "-"));
patient.setPresentAddrCity(TextUtil.getStr(presentAddrCity, "-"));
patient.setPresentAddrCounty(TextUtil.getStr(presentAddrCounty, "-"));
patient.setPresentAddrTown(TextUtil.getStr(presentAddrTown, "-"));
patient.setPresentAddrVillage(TextUtil.getStr(presentAddrVillage, "-"));
patient.setPresentAddrHouNo(TextUtil.getStr(presentAddrHouNo, "-"));
// 出生日期
final String birthday = requestXml.xpath("//personInfo/assignedPerson/birthTime/@value").get();
patient.setBirthday(Convert.toDate(birthday));
// 婚姻状况
final String marCode = requestXml.xpath("//personInfo/assignedPerson/maritalStatusCode/@value").get();
patient.setMarCode(marCode);
final String marName = XmlReadUtil.getRangeByKey("GB/T 2261.2-2003", marCode).getValue();
patient.setMarName(marName);
// ORG_ID 通过最后的机构名称查询
String orgName = requestXml.xpath("//personInfo/assignedOrganization/name/@value").get();
OrgMapper orgMapper = SpringUtils.getBean(OrgMapper.class);
Org org = orgMapper.selectOne(new LambdaQueryWrapper<Org>().eq(Org::getManagerorgname, orgName));
if (org != null) {
patient.setOrgId(org.getOrgid());
}else{
patient.setOrgId("1");
}
// 批次
String batchId = UUID.randomUUID(false).toString(true);
patient.setBatchId(batchId);
PatientMapper patientMapper = SpringUtils.getBean(PatientMapper.class);
patientMapper.insert(patient);
//保存通知
List<String> ids = webClientServer.saveNoice(new String[][]{
{"rhin:personRecordRevise",name+"居民信息发生变更"}
,{"rhin:personIdentifierRevise",name+"居民信息索引变更"}
,{"rhin:personIdentifierMerge",name+"居民信息合并"}
});
//检查是否有主题订阅,如有发送通知
webClientServer.checkAndNoice(ids);
return "<PersonRecordFeedResponse>\n" +
" <masterIdentifer>" +
TextUtil.format("<system value=\"{}\"/> \n", "") +
TextUtil.format("<value value=\"{}\"/> \n", pid) +
" </masterIdentifer>\n" +
"</PersonRecordFeedResponse>";
} catch (Exception e) {
// 对象转换为xml
return TextUtil.format("" +
"<returnData>\n" +
"\t<funCode>{}</funCode>\n" +
"\t<errorCode>{}</errorCode>\n" +
"\t<detail>{}</detail>\n" +
"</returnData> \n", getCode(), "500", e.getCause() != null ? e.getCause() : e.getMessage());
}
}
}
使用方法
public String HIPMessageServer(String action, String message) {
String result ="";
log.info("\n 交互服务入参信息: \n action:{} \n message:{}",action,message);
String[] beanNamesForType = applicationContext.getBeanNamesForType(ISoapServer.class);
for (String beanName : beanNamesForType) {
ISoapServer soapServer = applicationContext.getBean(beanName, ISoapServer.class);
if (soapServer.getCode().equals(action)) {
result = soapServer.server(message);
log.info("\n 交互服务出参信息: \n message:{}",result);
return result;
}
}
return result;
}
三、Map+函数式接口
@Service
public class GrantTypeSerive {
public String redPaper(String resourceId){
//红包的发放方式
return "每周末9点发放";
}
public String shopping(String resourceId){
//购物券的发放方式
return "每周三9点发放";
}
public String QQVip(String resourceId){
//qq会员的发放方式
return "每周一0点开始秒杀";
}
}
@Service
public class QueryGrantTypeService {
@Autowired
private GrantTypeSerive grantTypeSerive;
private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();
/**
* 初始化业务分派逻辑,代替了if-else部分
* key: 优惠券类型
* value: lambda表达式,最终会获得该优惠券的发放方式
*/
@PostConstruct
public void dispatcherInit(){
grantTypeMap.put("红包",resourceId->grantTypeSerive.redPaper(resourceId));
grantTypeMap.put("购物券",resourceId->grantTypeSerive.shopping(resourceId));
grantTypeMap.put("qq会员",resourceId->grantTypeSerive.QQVip(resourceId));
}
public String getResult(String resourceType){
//Controller根据 优惠券类型resourceType、编码resourceId 去查询 发放方式grantType
Function<String,String> result=getGrantTypeMap.get(resourceType);
if(result!=null){
//传入resourceId 执行这段表达式获得String型的grantType
return result.apply(resourceId);
}
return "查询不到该优惠券的发放方式";
}
}