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

类中所有方法开头均有相同if判断条件,可使用什么设计模式优化?

优化重复前置判断的常见实现方案

方案1:模板方法模式(最贴合需求的设计模式)

该模式可以把公共判断逻辑统一收拢到公共执行流程中,业务代码只需要关心核心逻辑即可,两种常用实现形式:

  • 类继承实现:
    定义抽象父类封装带前置判断的执行入口,子类仅实现核心业务逻辑,适合同类业务的多实现场景
// Java示例,其他语言逻辑通用
public abstract class BaseService {
    protected boolean locked;

    public final void execute() {
        // 公共前置判断全局统一维护
        if (locked) {
            return;
        }
        // 调用子类自定义业务逻辑
        doBusiness();
    }

    protected abstract void doBusiness();
}
  • 同一个类内封装通用执行器:
    不需要额外继承父类,适合单个类内部多个方法需要加前置判断的场景
// Java示例,用函数式接口传业务逻辑
private <T> T runWithLockCheck(Supplier<T> businessLogic) {
    if (locked) {
        return null;
    }
    return businessLogic.get();
}

// 业务方法调用示例
public void businessMethod1() {
    runWithLockCheck(() -> {
        // 直接写业务逻辑即可,无需重复写判断
        return null;
    });
}

方案2:装饰器模式

如果不想用继承破坏原有类的结构,可以用装饰器封装公共判断逻辑,把原始业务对象包装在装饰器中,调用时先走装饰器的前置判断,再执行真实业务方法,适合需要灵活给方法增减前置校验的场景。

方案3:切面编程(AOP,工程实践中最常用)

如果项目支持AOP能力(比如Spring项目、Python装饰器、JS高阶函数都可实现),可以直接给需要加判断的8个方法加自定义标记,全局切面统一拦截所有带标记的方法,执行前先判断locked状态,状态为真直接返回,完全不需要修改业务方法的原有代码。
Python实现示例:

def lock_check(func):
    def wrapper(self, *args, **kwargs):
        if self.locked:
            return
        return func(self, *args, **kwargs)
    return wrapper

# 业务方法仅需要加一个装饰器即可
@lock_check
def business_method1():
    # 直接写业务逻辑,不需要加任何判断
    pass

方案4:公共方法抽取(最轻量的快速实现)

如果场景非常简单不想引入复杂模式,也可以把判断逻辑封装成一个私有公共方法,每个业务方法开头直接调用即可:

private boolean checkLocked() {
    return locked;
}

// 业务方法开头仅需要写一行调用
if (checkLocked()) return;

虽然还是要每个方法加一行调用,但后续如果判断逻辑需要修改(比如加日志、调整判断规则)只需要改这一个公共方法,也比重复写8遍判断逻辑的可维护性高很多。

内容的提问来源于stack exchange,提问作者André Kuljis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:03