当前位置: 首页 > news >正文

23种设计模式 - 空对象模式

模式定义

空对象模式(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()方法,强制所有工具实现统一操作。
    真实工具类:
  • DrillToolCuttingTool实现具体功能(钻孔、切割)。
    空对象NullTool
  • 重写use()但不执行任何操作,避免客户端因未安装工具而崩溃。
    工厂类ToolFactory
  • 根据工具ID返回真实对象或空对象,隐藏空值判断逻辑。

优势与引用来源

消除空检查:客户端无需判断if (tool != nullptr)
增强健壮性:空对象提供无害默认行为,防止程序崩溃。
代码简洁性:逻辑集中于工厂类,客户端调用更简洁。

http://www.dtcms.com/a/32952.html

相关文章:

  • 2 20 数据开发面试题汇总
  • Trae+Qt+MSVC环境配置
  • 探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践
  • 2.21力扣-回溯组合
  • 『大模型笔记』详细对比GraphRAG与传统RAG!
  • 软件架构设计:信息系统基础
  • 《论软件的可靠性评价》审题技巧 - 系统架构设计师
  • 单片机总结【GPIO/TIM/IIC/SPI/UART】
  • 学习笔记-沁恒第五讲-米醋
  • 基于Flink SQL实现7天用户行为风险识别,结合滚动窗口预聚合与CEP复杂事件处理技术,根据用户7天的动作,包括交易,支付,评价等行为,识别用户的风险等级
  • JVM预热
  • Orcale、MySQL中参数类型的详解和运用场景(带示例)
  • 设计模式-Java
  • rknn 板端运行程序Invalid RKNN model version 6, Meet unsupported rknn target type
  • 答题卡识别阅卷系统(Matlab)
  • 【区块链】区块链密码学基础
  • 深度学习中的学习率调度器(lr_scheduler)详解:以 Cosine 余弦衰减为例(中英双语)
  • 内网穿透工具NPC(客户端以命令行方式连接详细教程)
  • 前端中的拖拽知识
  • SpringBoot项目实现用户token和资源的多重校验
  • 【面试系列】Java开发--AI常见面试题
  • 微信小程序项目 video 组件失效问题,无法播放本地视频
  • 大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1)
  • Percona XtraDB Cluster (PXC) 8.0的搭建
  • 【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
  • 为什么在 TypeScript 中需要使用 import type?——以 Babylon.js 为例
  • 无人机仿真、感知、规划
  • 千峰React:函数组件使用(2)
  • GIS地图、轨道交通与智能驾驶UI设计:未来交通的智能化探索
  • TPU(Tensor Processing Unit)详解