优雅的代替繁多的if/else(一)

前言

系统都有角色的概念,不同用户分配不同的角色,每个角色访问的资源及权限不一样比如:

系统管理员( ROLE_ROOT_ADMIN):有 A操作权限

订单管理员( ROLE_ORDER_ADMIN):有 B操作权限

普通用户( ROLE_NORMAL):有 C操作权限

比如一个用户进来,我们需要根据不同用户的角色来判断其有哪些行为,这时候常见的代码出现了:

public void  opt(String roleName) {

        String result = "";

        if (Objects.equals(roleName,"ROLE_ROOT_ADMIN")) { // 系统管理员有A权限

            optSth();

        } else if (Objects.equals(roleName,"ROLE_ORDER_ADMIN")) { // 订单管理员有B权限

            optSth();;

        } else if (Objects .equals(roleName,"ROLE_NORMAL")) { // 普通用户有C权限

            optSth();;

        } else {

            optSth();;

        }

    }

这样当系统里有几十个角色时,几十个 if/else嵌套…… 这样一来非常不优雅,别人阅读起来很困难;二来则是以后如果再复杂一点,或者想要再加条件的话不好扩展;而且业务代码一改,以前的代码也容易出错
如何避免呢?

枚举

定义一个公用接口 RoleOperation,表示不同角色所能做的操作

public interface RoleOpt{

String op(); // 表示某个角色可以做哪些op操作

}

定义一个不同角色有不同权限的枚举类 RoleEnum

public enum RoleEnum implements RoleOpt{

// 系统管理员(有A操作权限)
    ROLE_ROOT_ADMIN {
        @Override
        public String op() {
            return "" ;
        }
    },

    // 订单管理员(有B操作权限)
    ROLE_ORDER_ADMIN {
        @Override
        public String op() {
            return "";
        }
    },

    // 普通用户(有C操作权限)
    ROLE_NORMAL {
        @Override
        public String op() {
            return "";
        }
    };

}

调用

public String opt( String roleName ) {

 // 一行代码搞定!之前的if/else没了!

 return RoleEnum.valueOf(roleName).op();

 }

以后想扩充条件,只需要去枚举类中加代码即可

工厂模式

将不同情况单独定义好,然后去工厂类里面聚合

针对不同的角色,单独定义其业务类

public class RootAdminRole implements RoleOperation{

private String roleName;



@Override

public String op() {

return "";

}

}

同样定义其他角色处理类

OrderAdminRole NormalRole

工厂类 RoleFactory对上面不同角色进行聚合

public class RoleFactory{

	staticMap<String, RoleOperation> roleOperationMap = newHashMap<>();

	// 在静态块中先把初始化工作全部做完

	static{

		roleOperationMap.put( "ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN") );

		roleOperationMap.put( "ROLE_ORDER_ADMIN", new OrderAdminRole("ROLE_ORDER_ADMIN") );

		roleOperationMap.put( "ROLE_NORMAL", new NormalRole("ROLE_NORMAL") );

	}

 

	public static RoleOperation getOp( String roleName ) {

		return roleOperationMap.get( roleName );

	}

}

业务代码调用

public String opt( String roleName ) {

	// 一行代码搞定!之前的 if/else也没了!

	return RoleFactory.getOp(roleName).op();

}

猜你喜欢

转载自blog.csdn.net/liuerchong/article/details/124679959