引言
最近公司业务拓展需要对接互联网医院,针对数量繁多的医院且每家医院的要求各不一样,每次新增医院都会改动到之前的方法,增加条件判断,导致需要测试全量回归,迭代效率低下,为此结合软件设计的开闭原则(扩展开放、修改关闭),引入设计模式对代码进行优化,记录下来。希望对刚碰到类似问题的朋友有帮助。
优化前的代码
//查询病历记录
public List<MedicalRecordDTO> queryMedicalRecord(String hospitalCode,...){
if("PXEY".equalsIgnoreCase(hospitalCode)){ //萍乡某医院
}else if("JDSD".equalsIgnoreCase(hospitalCode)){ //暨大某医院
}else if("DGZYY".equalsIgnoreCase(hospitalCode)){ //东莞某医院
}...
}
优化后的代码
1.新增工厂类
@Component
public class HisProcessorFactory {
private List<HisProcessor> processors = new ArrayList<>();
public HisProcessor getProcessor(String hospitalCode) {
return processors.stream().filter(pro -> pro.getHospitalCode().equals(hospitalCode)).findAny().orElseThrow(() -> throw new BizException("医院对接尚未实现"));
}
void registerProcessor(HisProcessor processor) {
processors.add(processor);
}
}
2.新增接口类
public interface HisProcessor {
/**
* 获取医院代码
*
* @return 医院代码
*/
String getHospitalCode();
/**
* 获取病历记录
*
* @return 病历记录信息
*/
List<MedicalRecordDTO> queryMedicalRecord(...);
}
3.医院标准对接实现类(如果有共同的功能可以放在此类中)
public abstract class AbstractHisProcessor implements HisProcessor {
@Resource
protected HisProcessorFactory factory;
abstract void init();
}
4.具体医院对接实现类
@Component
public class PXEYProcessor extends AbstractHisProcessor {
@Override
public String getHospitalCode() {
return "PXEY";
}
@Override
public List<MedicalRecordDTO> queryMedicalRecord(...) {
//TODO 具体逻辑实现
}
@Override
@PostConstruct
void init() {
factory.registerProcessor(this);
}
}
@Component
public class JDSDProcessor extends AbstractHisProcessor {
@Override
public String getHospitalCode() {
return "JDSD";
}
@Override
public List<MedicalRecordDTO> queryMedicalRecord(...) {
//TODO 具体逻辑实现
}
@Override
@PostConstruct
void init() {
factory.registerProcessor(this);
}
}
优化后虽然类的数量上会增加,但是逻辑清晰,每次新增加一个医院只需要增加医院的对接实现类,不需要进行代码的修改,测试同学也不需要每次都担心之前的逻辑被改动到。