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

news/2025/2/21 8:41:58

模式定义

空对象模式(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.niftyadmin.cn/n/5860554.html

相关文章

SpringSecurity初始化的本质

一、对SpringSecurity初始化的几个疑问 通过前面第一次请求访问的分析我们明白了一个请求就来后的具体处理流程 对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该请求。那么这里我们就有几个疑惑。 FilterChainProxy什么时候创建的?过滤器链和对应的…

Llama 3.1 本地电脑部署 Linux系统 【轻松简易】

本文分享在自己的本地电脑部署 llama3.1&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Linux系统中进行大模型部署~ Llama3.1&#xff0c;有三个版本&#xff1a;8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型&#xff0c;在常识…

Mybatis的#{}和${}

#{}:预编译语句,用?对参数位置进行一个占位的操作,在数据库生成一个模版,等待后续填充.也可以推测出#在生成模版后的性能是比$快的. ${}:即时语句,提前的吧参数填充进去,在MySQL里就是一个完整的SQL语句. 填充逻辑不同 #{}会给String类型的参数自动的加上双引号,而${}则是直…

欢乐力扣:赎金信

文章目录 1、题目描述2、 代码 1、题目描述 赎金信&#xff0c;给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。magazine 中的每个字符只能在…

OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::TrainData 类是 OpenCV 机器学习模块中用于表示训练数据的一个核心类。它封装了样本数据、响应&#xff08;标签&#xff09;、样本权重…

旧手机热点无法提供ipv6解决方法(emui 8 热点提供ipv6)

旧手机热点无法提供ipv6解决方法 手机&#xff1a;荣耀8x 系统版本: EMUI 8 网络&#xff1a;移动流量卡 解决方案 设置-》无线和网络-》移动网络-》接入点名称(APN)-》cmiot 修改 APN协议: IPv4/IPv6 修改 APN漫游协议: IPv4/IPv6

网易严选DevOps实践:从传统到云原生的演进

在互联网行业的快速变革中&#xff0c;网易严选面临着前所未有的挑战和机遇。为了提升产品研发运营效率&#xff0c;降低创新成本&#xff0c;网易严选积极拥抱DevOps文化&#xff0c;并在其实践过程中积累了宝贵的经验。本文将深入探讨网易严选在DevOps领域的实践之旅&#xf…

本2硕9电子科学专业,想走linux或是嵌入式,要具体学哪些技术

​今天给大家分享的是一位粉丝的提问&#xff0c;本2硕9电子科学专业&#xff0c;想走linux或是嵌入式&#xff0c;要具体学哪些技术 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 你好&…