Java 优雅地分离验证代码与业务核心代码,减少过多的if-else

版权声明:本文为博主原创文章,转载请与博主联系获得授权 https://blog.csdn.net/qq_24091555/article/details/84138630

在平常项目开发中,不知道你们有没有遇上这么一个现象:业务模块在进行某个业务运算前, 都要先通过一些验证。随着业务扩展,这些验证越来越多,if-else的写法越来越显得麻烦,而且很多部分不能实现复用。基于为解决以上痛点,我用采用这样的写法,效果还不错。

废话不多说,看Demo。

验证接口类:Condition.java

/**
 * 验证接口
 * @param <T>
 */
public interface Condition<T> {

    /**
     * 验证
     * @param t
     */
    void valid(T t);
}

验证条件实现类:UserTypeCondition.java

/** 
 * 用户类型验证条件
 * @author rocky
 * @date 2018-11-16 13:53
 */
public class UserTypeCondition implements Condition<User> {

    @Override
    public void valid(User user) {
        if (user.getUserType() != UserType.MEMBER) {
            throw new ValidException("用户不是会员,不能执行该操作。");
        }
    }
}

/**
 * 用户类型
 */
public enum UserType {
    /**
     * 普通用户
     */
    ORDINARY,

    /**
     * 会员用户
     */
    MEMBER;
}

/**
 * @author rocky
 * @date 2018-11-16 13:53
 */
public class User {
    private String username;
    private String password;
    private UserType userType;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserType getUserType() {
        return userType;
    }

    public void setUserType(UserType userType) {
        this.userType = userType;
    }
}

核心代码:


/**
 * @author rocky
 * @date 2018-11-16 13:58
 */
public class Test {

    public static void main(String[] args) {
        /* 模仿业务操作 */
        User user = new User();
        user.setUsername("小张");
        user.setUserType(UserType.ORDINARY);

        /* 验证条件List,后续有增加,只要实现Condition接口,往List add */
        List<Condition<User>> conditionList = Arrays.asList(new UserTypeCondition());

		/* 进入验证 */
       	validUser(user, conditionList);
       	
       	//todo  后面进行核心业务

    }

    /**
     * 进行对user进行业务验证
     * @param user
     * @param conditionList
     */
    public static void validUser(User user, List<Condition<User>> conditionList) {
        conditionList.forEach(condition -> {
            condition.valid(user);
        });
    }

}

这样的方式,在后续增加业务层面的验证时,可以实现验证接口,然后添加到验证条件实现类的List。这样就大大增加了扩展的灵活性。而且在同样业务领域内,这些验证条件实现类可以实现复用。

猜你喜欢

转载自blog.csdn.net/qq_24091555/article/details/84138630