模式定义
空对象模式(Null Object Pattern)是一种行为型设计模式,通过用无操作的空对象替代null
值,消除客户端对空值的检查,避免空指针异常。其核心是让空对象与真实对象实现相同接口,但空对象不执行实际逻辑。
模式结构
抽象对象(Abstract Object)
- 定义所有对象的统一接口(如
Tool
类中的use()
方法)。
真实对象(Real Object) - 实现具体功能(如
DrillTool
钻孔操作)。
空对象(Null Object) - 实现相同接口但无实际操作(如
NullTool
静默处理调用)。
适用场景
数控系统工具管理:未安装工具时返回空工具对象。
避免空值检查:如数据库查询未找到记录时返回空实体。
简化客户端逻辑:无需判断对象是否为null
。
C++示例(数控系统工具切换)
场景说明:
数控机床切换工具时,若未安装工具则返回空对象,避免空指针异常。
#include
#include
// 抽象工具接口
class Tool {
public:
virtual void use() = 0;
virtual ~Tool() = default;
};
// 真实对象:钻孔工具
class DrillTool : public Tool {
public:
void use() override {
std::cout << "钻孔工具启动:开始钻孔操作\n";
}
};
// 真实对象:切割工具
class CuttingTool : public Tool {
public:
void use() override {
std::cout << "切割工具启动:开始切割操作\n";
}
};
// 空对象:未安装工具
class NullTool : public Tool {
public:
void use() override {
// 空操作,不输出任何内容
}
};
// 工具工厂类
class ToolFactory {
public:
static std::shared_ptr getTool(int toolId) {
switch (toolId) {
case 1: return std::make_shared();
case 2: return std::make_shared();
default: return std::make_shared(); // 无效ID返回空对象
}
}
};
// 客户端代码(数控系统操作)
int main() {
// 模拟工具切换(假设当前未安装工具,ID=0)
auto tool = ToolFactory::getTool(0);
tool->use(); // 安全调用,无空指针风险
// 安装钻孔工具(ID=1)
tool = ToolFactory::getTool(1);
tool->use();
return 0;
}
代码解释
抽象接口Tool
:
- 定义
use()
方法,强制所有工具实现统一操作。
真实工具类: DrillTool
和CuttingTool
实现具体功能(钻孔、切割)。
空对象NullTool
:- 重写
use()
但不执行任何操作,避免客户端因未安装工具而崩溃。
工厂类ToolFactory
: - 根据工具ID返回真实对象或空对象,隐藏空值判断逻辑。
优势与引用来源
消除空检查:客户端无需判断if (tool != nullptr)
。
增强健壮性:空对象提供无害默认行为,防止程序崩溃。
代码简洁性:逻辑集中于工厂类,客户端调用更简洁。