具体获取策略类
package com.shuidihuzhu.sdb.mineral.util.Identity;
import com.shuidihuzhu.sdb.mineral.enums.IdType;
import lombok.Data;
import org.apache.commons.collections4.MapUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @author wjl
* @version 1.0
* @date 2022/4/17 下午2:57
* 身份解析上下文
*/
@Data
@Component
public class IdentityInfoStrategyContext implements ApplicationContextAware{
/**
* 具体执行的策略
*/
private IdentityInfoStrategy identityInfoStrategy;
private static Map<String, IdentityInfoStrategy> identityInfoStrategyMap = new HashMap<>();
private ApplicationContext applicationContext;
public IdentityInfoStrategy getIdentityInfoStrategyContext(IdType idType) {
return getIdentityInfoStrategyMap().get(idType.name());
// switch (idType){
// case BIRTH_CARD:
// this.identityInfoStrategy = new BirthCertificateStrategy();
// break;
// default:
// this.identityInfoStrategy = new IdCardStrategy();
// break;
// }
}
public Map<String, IdentityInfoStrategy> getIdentityInfoStrategyMap(){
if (MapUtils.isEmpty(identityInfoStrategyMap)){
Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(IdentityInfoAnnotation.class);
for (Object bean :beansWithAnnotation.values()) {
if (bean instanceof IdentityInfoStrategy){
identityInfoStrategyMap.put(bean.getClass().getAnnotation(IdentityInfoAnnotation.class).value(),(IdentityInfoStrategy) bean);
}
}
}
return identityInfoStrategyMap;
}
}
自定义注解-用于扫描相应策略
package com.shuidihuzhu.sdb.mineral.util.Identity;
import java.lang.annotation.*;
/**
* @author wjl
* @version 1.0
* @date 2022/6/5 下午5:49
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface IdentityInfoAnnotation {
String desc() default "";
String value() default "";
}
具体策略一
package com.shuidihuzhu.sdb.mineral.util.Identity;
import com.shuidihuzhu.sdb.mineral.util.IdcardInfoUtil;
import org.springframework.stereotype.Service;
/**
* @author wjl
* @version 1.0
* @date 2022/4/17 下午2:54
*
* 身份证
*
*/
@IdentityInfoAnnotation(value = "ID_CARD")
@Service
public class IdCardStrategy implements IdentityInfoStrategy{
@Override
public IdcardInfoUtil getCardInfo(IdentityInfo identityInfo) {
return new IdcardInfoUtil(identityInfo.getIdCard());
}
}
具体策略二
package com.shuidihuzhu.sdb.mineral.util.Identity;
import com.shuidihuzhu.common.util.JsonUtil;
import com.shuidihuzhu.common.web.util.DateUtil;
import com.shuidihuzhu.sdb.constants.sdbinsurance.ErrorCode;
import com.shuidihuzhu.sdb.mineral.util.IdcardInfoUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Objects;
/**
* @author wjl
* @version 1.0
* @date 2022/4/17 下午2:56
*/
@Slf4j
@IdentityInfoAnnotation(value = "BIRTH_CARD")
@Service
public class BirthCertificateStrategy implements IdentityInfoStrategy{
@Override
public IdcardInfoUtil getCardInfo(IdentityInfo identityInfo) {
IdcardInfoUtil infoUtil = new IdcardInfoUtil();
return infoUtil;
}
}
具体使用
//获取具体执行策略
IdentityInfoStrategy strategy = identityInfoStrategyContext.getIdentityInfoStrategyContext(IdType.ID_CARD);
// do someting