类型转换链(单一处理-只要一个可以处理)

类型转换链(单一处理-只要一个可以处理)

使用范围:前端表单请求转换成后端实体类

技术

使用了SPI机制获取实现类代码

类型转换责任链

类型转换链

public class TypeSwitchChain<T> {
    // 服务提供者加载工具,通过配置文件找到对应的接口的实现类并返回实现类的集合
    private static ServiceLoader<TypeSwitch> switches = ServiceLoader.load(TypeSwitch.class);
    // 迭代器
    private Iterator<TypeSwitch> iterator = switches.iterator();

    public T doTypeSwitch(Class<?> clazz, Object value) {
        while (iterator.hasNext()){
            TypeSwitch<T> tTypeSwitch = iterator.next();
            if (tTypeSwitch.supports(clazz)){
                return tTypeSwitch.valueOf(value);
            }
        }
        return null;
    }
}

类型转换接口

public interface TypeSwitch<T> {
    /**
     * 进行判断,看实现类是否可以执行
     *
     * @param clazz 字段类型
     * @return
     */
    boolean supports(Class<?> clazz);

    /**
     * 处理值
     *
     * @param value 需要转换的值
     * @return
     */
    T valueOf(Object value);
}

类型转换实现类

String 类型转换
public class StringSwitch implements TypeSwitch<String> {
    @Override
    public boolean supports(Class<?> clazz) {
        return clazz == String.class;
    }

    @Override
    public String valueOf(Object value) {
        return value.toString();
    }
}
Integer 类型转换
public class IntegerSwitch implements TypeSwitch<Integer> {
    @Override
    public boolean supports(Class clazz) {
        return clazz == Integer.class || clazz == Integer.TYPE;
    }

    @Override
    public Integer valueOf(Object value) {
        return Integer.valueOf(value.toString());
    }
}