空对象模式(C)

假设一个抽象类:

class ILogger {
    virtual ~ILogger() = default;
    virtual Log(const std::string&) = 0;
};

代替

void doJob(ILogger* logger) {
    if (logger) {
         logger->Log("[doJob]:Step 1");
    }
    // ...
    if (logger) {
         logger->Log("[doJob]:Step 2");
    }
    // ...
    if (logger) {
         logger->Log("[doJob]:End");
    }
}

void doJobWithoutLogging()
{
    doJob(nullptr);
}

你可以创建一个 Null 对象记录器:

class NullLogger : public ILogger
{
    void Log(const std::string&) override { /* Empty */ }
};

然后在以下内容中更改 doJob

void doJob(ILogger& logger) {
    logger.Log("[doJob]:Step1");
    // ...
    logger.Log("[doJob]:Step 2");
    // ...
    logger.Log("[doJob]:End");
}

void doJobWithoutLogging()
{
    NullLogger logger;
    doJob(logger);
}