如何移除if语句中多OR连接的条件?求符合开闭原则的实现方案
移除多条件if的解决方案(遵循开闭原则)
方案1:封装统一检查方法(简单直接,适合变动少的场景)
先在Utilisateur类里新增一个统一的权限判断方法,把所有分散的条件收拢:
public boolean hasAdminLevelPrivilege() { return isAdmin() || isWebMaster() || isAdministrateurLiferay() || estResponsableCommercial(); }
原来的if语句直接简化成:
if (utilisateur.hasAdminLevelPrivilege()) { // 你的业务逻辑 }
这个方案的缺点是,以后新增权限需要修改这个方法,不太符合严格的开闭原则,适合权限变动不频繁的场景。
方案2:接口+策略模式(严格遵循开闭原则)
如果需要频繁新增权限类型,用这个方式最合适,完全符合“对扩展开放、对修改关闭”的要求:
第一步:定义权限检查接口
用函数式接口可以让实现更简洁:
@FunctionalInterface public interface PrivilegeChecker { boolean check(Utilisateur utilisateur); }
第二步:为每个权限实现对应检查器
比如对应estResponsableCommercial的检查器:
public class ResponsableCommercialChecker implements PrivilegeChecker { @Override public boolean check(Utilisateur utilisateur) { return utilisateur.getRoles().stream().anyMatch(Role::isResponsableCommercial); } }
同理,Admin、WebMaster等权限都各自实现一个PrivilegeChecker子类即可。
第三步:在Utilisateur类中维护检查器集合,提供统一检查方法
import java.util.List; public class Utilisateur { // 可通过构造方法注入,或用setter动态添加检查器 private List<PrivilegeChecker> privilegeCheckers; public boolean hasRequiredPrivilege() { return privilegeCheckers.stream().anyMatch(checker -> checker.check(this)); } // getter和setter public List<PrivilegeChecker> getPrivilegeCheckers() { return privilegeCheckers; } public void setPrivilegeCheckers(List<PrivilegeChecker> privilegeCheckers) { this.privilegeCheckers = privilegeCheckers; } }
第四步:实际使用
初始化时将需要的检查器注入:
List<PrivilegeChecker> checkers = List.of( new AdminChecker(), new WebMasterChecker(), new AdministrateurLiferayChecker(), new ResponsableCommercialChecker() ); Utilisateur utilisateur = new Utilisateur(); utilisateur.setPrivilegeCheckers(checkers); // 业务代码中的判断逻辑变得简洁 if (utilisateur.hasRequiredPrivilege()) { // 执行你的业务逻辑 }
后续新增权限时,只需要新增一个PrivilegeChecker实现类,再将其加入检查器集合即可,完全不需要修改原有代码,完美遵循开闭原则。
方案3:枚举类+函数式接口(简洁的开闭实现)
如果权限类型相对固定但可能扩展,用枚举封装会更紧凑:
第一步:定义权限枚举
import java.util.Arrays; import java.util.function.Predicate; public enum Privilege { ADMIN(Utilisateur::isAdmin), WEB_MASTER(Utilisateur::isWebMaster), LIFERAY_ADMIN(Utilisateur::isAdministrateurLiferay), COMMERCIAL_RESPONSIBLE(Utilisateur::estResponsableCommercial); private final Predicate<Utilisateur> checker; Privilege(Predicate<Utilisateur> checker) { this.checker = checker; } public boolean check(Utilisateur utilisateur) { return checker.test(utilisateur); } // 静态方法:检查用户是否拥有任意指定权限 public static boolean hasAnyPrivilege(Utilisateur utilisateur, Privilege... privileges) { return Arrays.stream(privileges).anyMatch(p -> p.check(utilisateur)); } }
第二步:使用方式
// 检查用户是否拥有枚举中的任意权限 if (Privilege.hasAnyPrivilege(utilisateur, Privilege.values())) { // 业务逻辑 } // 也可以指定只检查部分权限 if (Privilege.hasAnyPrivilege(utilisateur, Privilege.ADMIN, Privilege.COMMERCIAL_RESPONSIBLE)) { // 逻辑代码 }
新增权限时,只需要在枚举中添加新的枚举项即可,无需修改其他代码,同样符合开闭原则,且代码更简洁。
内容的提问来源于stack exchange,提问作者Abdel
相关产品推荐
相关产品推荐

