空物件模式(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);
}