You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:15:43